diff --git a/build_number_offset b/build_number_offset index d9e63ef1b8..443b34dd0c 100644 --- a/build_number_offset +++ b/build_number_offset @@ -1 +1 @@ -2620 +2720 diff --git a/submodules/TelegramUI/Components/ChatTitleView/Sources/ChatTitleComponent.swift b/submodules/TelegramUI/Components/ChatTitleView/Sources/ChatTitleComponent.swift index be38d26f7b..64ed2c7941 100644 --- a/submodules/TelegramUI/Components/ChatTitleView/Sources/ChatTitleComponent.swift +++ b/submodules/TelegramUI/Components/ChatTitleView/Sources/ChatTitleComponent.swift @@ -16,7 +16,7 @@ import EmojiStatusComponent import GlassBackgroundComponent public final class ChatNavigationBarTitleView: UIView, NavigationBarTitleView { - private final class ContentData { + private final class ContentData: Equatable { let context: AccountContext let theme: PresentationTheme let preferClearGlass: Bool @@ -36,6 +36,34 @@ public final class ChatNavigationBarTitleView: UIView, NavigationBarTitleView { self.nameDisplayOrder = nameDisplayOrder self.content = content } + + static func ==(lhs: ContentData, rhs: ContentData) -> Bool { + if lhs.context !== rhs.context { + return false + } + if lhs.theme !== rhs.theme { + return false + } + if lhs.preferClearGlass != rhs.preferClearGlass { + return false + } + if lhs.wallpaper != rhs.wallpaper { + return false + } + if lhs.strings !== rhs.strings { + return false + } + if lhs.dateTimeFormat != rhs.dateTimeFormat { + return false + } + if lhs.nameDisplayOrder != rhs.nameDisplayOrder { + return false + } + if lhs.content != rhs.content { + return false + } + return true + } } private let parentTitleState = ComponentState() @@ -86,9 +114,9 @@ public final class ChatNavigationBarTitleView: UIView, NavigationBarTitleView { content: ChatTitleContent, transition: ComponentTransition, ignoreParentTransitionRequests: Bool = false - ) { + ) -> Bool { self.ignoreParentTransitionRequests = ignoreParentTransitionRequests - self.contentData = ContentData( + let contentData = ContentData( context: context, theme: theme, preferClearGlass: preferClearGlass, @@ -98,8 +126,12 @@ public final class ChatNavigationBarTitleView: UIView, NavigationBarTitleView { nameDisplayOrder: nameDisplayOrder, content: content ) + let isUpdated = self.contentData != contentData + self.contentData = contentData self.update(transition: transition) self.ignoreParentTransitionRequests = false + + return isUpdated } public func updateActivities(activities: ChatTitleComponent.Activities?, transition: ComponentTransition) { diff --git a/submodules/TelegramUI/Sources/Chat/UpdateChatPresentationInterfaceState.swift b/submodules/TelegramUI/Sources/Chat/UpdateChatPresentationInterfaceState.swift index c1ba97148d..e12b4eef7d 100644 --- a/submodules/TelegramUI/Sources/Chat/UpdateChatPresentationInterfaceState.swift +++ b/submodules/TelegramUI/Sources/Chat/UpdateChatPresentationInterfaceState.swift @@ -456,12 +456,14 @@ func updateChatPresentationInterfaceStateImpl( selfController.tempHideAccessoryPanels = selfController.presentationInterfaceState.search != nil - if let chatTitleContent = selfController.contentData?.state.chatTitleContent { + var forceLayout = false + + if let chatTitleContent = selfController.contentData?.state.chatTitleContent, let chatTitleView = selfController.chatTitleView { var titleTransition = ComponentTransition(transition) if case .messageOptions = selfController.subject { titleTransition = titleTransition.withAnimation(.none) } - selfController.chatTitleView?.update( + let isChatTitleViewUpdated = chatTitleView.update( context: selfController.context, theme: selfController.presentationData.theme, preferClearGlass: selfController.presentationInterfaceState.preferredGlassType == .clear, @@ -473,10 +475,13 @@ func updateChatPresentationInterfaceStateImpl( transition: titleTransition, ignoreParentTransitionRequests: true ) + if isChatTitleViewUpdated { + forceLayout = true + } } if selfController.isNodeLoaded { - selfController.chatDisplayNode.updateChatPresentationInterfaceState(updatedChatPresentationInterfaceState, transition: transition, interactive: interactive, completion: completion) + selfController.chatDisplayNode.updateChatPresentationInterfaceState(updatedChatPresentationInterfaceState, transition: transition, interactive: interactive, forceLayout: forceLayout, completion: completion) } else { completion(.immediate) } diff --git a/submodules/TelegramUI/Sources/ChatControllerEditChat.swift b/submodules/TelegramUI/Sources/ChatControllerEditChat.swift index ef3f5d4031..d7264eddfd 100644 --- a/submodules/TelegramUI/Sources/ChatControllerEditChat.swift +++ b/submodules/TelegramUI/Sources/ChatControllerEditChat.swift @@ -49,7 +49,7 @@ extension ChatControllerImpl { contentNode.setErrorText(errorText: self.presentationData.strings.QuickReply_ShortcutExistsInlineError) } } else { - self.chatTitleView?.update( + let _ = self.chatTitleView?.update( context: self.context, theme: self.presentationData.theme, preferClearGlass: self.presentationInterfaceState.preferredGlassType == .clear, @@ -102,7 +102,7 @@ extension ChatControllerImpl { } else { linkUrl = link.url } - self.chatTitleView?.update( + let _ = self.chatTitleView?.update( context: self.context, theme: self.presentationData.theme, preferClearGlass: self.presentationInterfaceState.preferredGlassType == .clear, diff --git a/submodules/TelegramUI/Sources/ChatControllerNode.swift b/submodules/TelegramUI/Sources/ChatControllerNode.swift index a916a270ac..d4dc611813 100644 --- a/submodules/TelegramUI/Sources/ChatControllerNode.swift +++ b/submodules/TelegramUI/Sources/ChatControllerNode.swift @@ -3435,7 +3435,7 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate { } } - func updateChatPresentationInterfaceState(_ chatPresentationInterfaceState: ChatPresentationInterfaceState, transition: ContainedViewLayoutTransition, interactive: Bool, completion: @escaping (ContainedViewLayoutTransition) -> Void) { + func updateChatPresentationInterfaceState(_ chatPresentationInterfaceState: ChatPresentationInterfaceState, transition: ContainedViewLayoutTransition, interactive: Bool, forceLayout: Bool, completion: @escaping (ContainedViewLayoutTransition) -> Void) { self.selectedMessages = chatPresentationInterfaceState.interfaceState.selectionState?.selectedIds var textStateUpdated = false @@ -3451,7 +3451,7 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate { let presentationReadyUpdated = self.chatPresentationInterfaceState.presentationReady != chatPresentationInterfaceState.presentationReady - if (self.chatPresentationInterfaceState != chatPresentationInterfaceState && chatPresentationInterfaceState.presentationReady) || textStateUpdated { + if (self.chatPresentationInterfaceState != chatPresentationInterfaceState && chatPresentationInterfaceState.presentationReady) || textStateUpdated || forceLayout { self.onLayoutCompletions.append(completion) let themeUpdated = presentationReadyUpdated || (self.chatPresentationInterfaceState.theme !== chatPresentationInterfaceState.theme)