diff --git a/submodules/ItemListUI/Sources/ItemListControllerNode.swift b/submodules/ItemListUI/Sources/ItemListControllerNode.swift index 0eacb7ad40..093ed9b76c 100644 --- a/submodules/ItemListUI/Sources/ItemListControllerNode.swift +++ b/submodules/ItemListUI/Sources/ItemListControllerNode.swift @@ -802,6 +802,64 @@ open class ItemListControllerNode: ASDisplayNode { self.toolbarItem = transition.toolbarItem } + var updateFooterItem = false + if let footerItem = self.footerItem, let updatedFooterItem = transition.footerItem { + updateFooterItem = !footerItem.isEqual(to: updatedFooterItem) + } else if (self.footerItem != nil) != (transition.footerItem != nil) { + updateFooterItem = true + } + if updateFooterItem { + let hadFooter = self.footerItem != nil + self.footerItem = transition.footerItem + if let footerItem = transition.footerItem { + let updatedNode = footerItem.node(current: self.footerItemNode) + if let footerItemNode = self.footerItemNode, updatedNode !== footerItemNode { + footerItemNode.removeFromSupernode() + } + if self.footerItemNode !== updatedNode { + self.footerItemNode = updatedNode + + let footerHeight: CGFloat + if let validLayout = self.validLayout { + footerHeight = updatedNode.updateLayout(layout: validLayout.0, transition: .immediate) + } else { + footerHeight = 100.0 + } + self.addSubnode(updatedNode) + + if !hadFooter && !transition.firstTime { + updatedNode.layer.animatePosition(from: CGPoint(x: 0.0, y: footerHeight), to: .zero, duration: 0.25, additive: true) + } + + if !hadFooter, let (layout, navigationBarHeight, _) = self.validLayout { + var insets = layout.insets(options: [.input]) + insets.top += navigationBarHeight + insets.bottom = footerHeight + + let inset = max(16.0, floor((layout.size.width - 674.0) / 2.0)) + if layout.size.width >= 375.0 { + insets.left += inset + insets.right += inset + } + + let (duration, curve) = listViewAnimationDurationAndCurve(transition: .immediate) + self.listNode.transaction(deleteIndices: [], insertIndicesAndItems: [], updateIndicesAndItems: [], options: [.Synchronous, .LowLatency], scrollToItem: nil, updateSizeAndInsets: ListViewUpdateSizeAndInsets(size: layout.size, insets: insets, duration: duration, curve: curve), stationaryItemRange: nil, updateOpaqueState: nil, completion: { _ in }) + } + } + } else if let footerItemNode = self.footerItemNode { + let footerHeight: CGFloat + if let validLayout = self.validLayout { + footerHeight = footerItemNode.updateLayout(layout: validLayout.0, transition: .immediate) + } else { + footerHeight = 100.0 + } + footerItemNode.layer.animatePosition(from: .zero, to: CGPoint(x: 0.0, y: footerHeight), duration: 0.25, removeOnCompletion: false, additive: true, completion: { [weak footerItemNode] _ in + footerItemNode?.removeFromSupernode() + }) + self.footerItemNode = nil + } + } + self.listNode.transaction(deleteIndices: transition.entries.deletions, insertIndicesAndItems: transition.entries.insertions, updateIndicesAndItems: transition.entries.updates, options: options, scrollToItem: scrollToItem, updateOpaqueState: ItemListNodeOpaqueState(mergedEntries: transition.mergedEntries), completion: { [weak self] _ in if let strongSelf = self { if !strongSelf.didSetReady { @@ -924,48 +982,6 @@ open class ItemListControllerNode: ASDisplayNode { self.headerItemNode = nil } } - var updateFooterItem = false - if let footerItem = self.footerItem, let updatedFooterItem = transition.footerItem { - updateFooterItem = !footerItem.isEqual(to: updatedFooterItem) - } else if (self.footerItem != nil) != (transition.footerItem != nil) { - updateFooterItem = true - } - if updateFooterItem { - let hadFooter = self.footerItem != nil - self.footerItem = transition.footerItem - if let footerItem = transition.footerItem { - let updatedNode = footerItem.node(current: self.footerItemNode) - if let footerItemNode = self.footerItemNode, updatedNode !== footerItemNode { - footerItemNode.removeFromSupernode() - } - if self.footerItemNode !== updatedNode { - self.footerItemNode = updatedNode - - let footerHeight: CGFloat - if let validLayout = self.validLayout { - footerHeight = updatedNode.updateLayout(layout: validLayout.0, transition: .immediate) - } else { - footerHeight = 100.0 - } - self.addSubnode(updatedNode) - - if !hadFooter && !transition.firstTime { - updatedNode.layer.animatePosition(from: CGPoint(x: 0.0, y: footerHeight), to: .zero, duration: 0.25, additive: true) - } - } - } else if let footerItemNode = self.footerItemNode { - let footerHeight: CGFloat - if let validLayout = self.validLayout { - footerHeight = footerItemNode.updateLayout(layout: validLayout.0, transition: .immediate) - } else { - footerHeight = 100.0 - } - footerItemNode.layer.animatePosition(from: .zero, to: CGPoint(x: 0.0, y: footerHeight), duration: 0.25, removeOnCompletion: false, additive: true, completion: { [weak footerItemNode] _ in - footerItemNode?.removeFromSupernode() - }) - self.footerItemNode = nil - } - } self.listNode.scrollEnabled = transition.scrollEnabled if updateSearchItem { diff --git a/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/EmojiPickerItem.swift b/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/EmojiPickerItem.swift index 78aac7a4d0..6ab20079ed 100644 --- a/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/EmojiPickerItem.swift +++ b/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/EmojiPickerItem.swift @@ -123,7 +123,7 @@ final class EmojiPickerItemNode: ListViewItemNode { if let snapshot = strongSelf.view.snapshotView(afterScreenUpdates: false) { snapshot.frame = CGRect(origin: CGPoint(x: 0.0, y: -insets.top), size: snapshot.frame.size) strongSelf.view.addSubview(snapshot) - snapshot.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { _ in + snapshot.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, delay: 0.25, removeOnCompletion: false, completion: { _ in snapshot.removeFromSuperview() }) } diff --git a/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/PeerNameColorChatPreviewItem.swift b/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/PeerNameColorChatPreviewItem.swift index 8a0f46bade..8cc1b6b1ff 100644 --- a/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/PeerNameColorChatPreviewItem.swift +++ b/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/PeerNameColorChatPreviewItem.swift @@ -261,7 +261,7 @@ final class PeerNameColorChatPreviewItemNode: ListViewItemNode { if let snapshot = strongSelf.view.snapshotView(afterScreenUpdates: false) { snapshot.frame = CGRect(origin: CGPoint(x: 0.0, y: -insets.top), size: snapshot.frame.size) strongSelf.view.addSubview(snapshot) - snapshot.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, delay: 0.1, removeOnCompletion: false, completion: { _ in + snapshot.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, delay: 0.25, removeOnCompletion: false, completion: { _ in snapshot.removeFromSuperview() }) } diff --git a/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/PeerNameColorScreen.swift b/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/PeerNameColorScreen.swift index 127ce4b4bc..9d1f59cd45 100644 --- a/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/PeerNameColorScreen.swift +++ b/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/PeerNameColorScreen.swift @@ -318,7 +318,7 @@ public func PeerNameColorScreen( statePromise.get(), context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: peerId)) ) - |> mapToSignal { state, peer -> Signal in + |> mapToSignal { state, peer -> Signal in var selectedEmojiId: Int64? if let updatedBackgroundEmojiId = state.updatedBackgroundEmojiId { selectedEmojiId = updatedBackgroundEmojiId @@ -353,7 +353,6 @@ public func PeerNameColorScreen( selectedItems: Set(selectedItems), backgroundIconColor: nameColor ) - |> map(Optional.init) } let presentationData = updatedPresentationData?.signal ?? context.sharedContext.presentationData @@ -361,8 +360,8 @@ public func PeerNameColorScreen( presentationData, statePromise.get(), context.engine.stickers.availableReactions(), - context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: peerId)), - .single(nil) |> then(emojiContent) + context.engine.data.subscribe(TelegramEngine.EngineData.Item.Peer.Peer(id: peerId)), + emojiContent ) |> deliverOnMainQueue |> map { presentationData, state, availableReactions, peer, emojiContent -> (ItemListControllerState, (ItemListNodeState, Any)) in @@ -478,7 +477,7 @@ public func PeerNameColorScreen( } ) - emojiContent?.inputInteractionHolder.inputInteraction = EmojiPagerContentComponent.InputInteraction( + emojiContent.inputInteractionHolder.inputInteraction = EmojiPagerContentComponent.InputInteraction( performItemAction: { _, item, _, _, _, _ in var selectedFileId: Int64? if let fileId = item.itemFile?.fileId.id {