From fc778ceb5d911c78f69aec2a65dafb8a161df959 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Thu, 22 Jul 2021 19:56:00 +0200 Subject: [PATCH] Floating avatar bug fixes --- .../Sources/ChatListSearchItemHeader.swift | 8 ++ .../Sources/ContactListNameIndexHeader.swift | 8 ++ submodules/Display/Source/ListView.swift | 73 +++++++++++++++---- .../Display/Source/ListViewItemHeader.swift | 3 + .../Display/Source/ListViewItemNode.swift | 5 ++ .../Sources/ItemListPeerItem.swift | 8 ++ .../Sources/ListMessageDateHeader.swift | 8 ++ .../ChatMessageAnimatedStickerItemNode.swift | 5 ++ .../Sources/ChatMessageBubbleItemNode.swift | 5 ++ .../Sources/ChatMessageDateHeader.swift | 29 +++++++- .../ChatMessageInstantVideoItemNode.swift | 5 ++ .../TelegramUI/Sources/ChatMessageItem.swift | 2 +- .../Sources/ChatMessageItemView.swift | 14 ++++ .../Sources/ChatMessageStickerItemNode.swift | 5 ++ 14 files changed, 161 insertions(+), 17 deletions(-) diff --git a/submodules/ChatListSearchItemHeader/Sources/ChatListSearchItemHeader.swift b/submodules/ChatListSearchItemHeader/Sources/ChatListSearchItemHeader.swift index ab2515d3ed..35c867213e 100644 --- a/submodules/ChatListSearchItemHeader/Sources/ChatListSearchItemHeader.swift +++ b/submodules/ChatListSearchItemHeader/Sources/ChatListSearchItemHeader.swift @@ -170,6 +170,14 @@ public final class ChatListSearchItemHeader: ListViewItemHeader { self.actionTitle = actionTitle self.action = action } + + public func combinesWith(other: ListViewItemHeader) -> Bool { + if let other = other as? ChatListSearchItemHeader, other.id == self.id { + return true + } else { + return false + } + } public func node(synchronousLoad: Bool) -> ListViewItemHeaderNode { return ChatListSearchItemHeaderNode(type: self.type, theme: self.theme, strings: self.strings, actionTitle: self.actionTitle, action: self.action) diff --git a/submodules/ContactListUI/Sources/ContactListNameIndexHeader.swift b/submodules/ContactListUI/Sources/ContactListNameIndexHeader.swift index 7390365843..2d263ec274 100644 --- a/submodules/ContactListUI/Sources/ContactListNameIndexHeader.swift +++ b/submodules/ContactListUI/Sources/ContactListNameIndexHeader.swift @@ -18,6 +18,14 @@ final class ContactListNameIndexHeader: Equatable, ListViewItemHeader { self.letter = letter self.id = ListViewItemNode.HeaderId(space: 0, id: Int64(letter)) } + + func combinesWith(other: ListViewItemHeader) -> Bool { + if let other = other as? ContactListNameIndexHeader, self.id == other.id { + return true + } else { + return false + } + } func node(synchronousLoad: Bool) -> ListViewItemHeaderNode { return ContactListNameIndexHeaderNode(theme: self.theme, letter: self.letter) diff --git a/submodules/Display/Source/ListView.swift b/submodules/Display/Source/ListView.swift index 7221fe1e86..489fc15251 100644 --- a/submodules/Display/Source/ListView.swift +++ b/submodules/Display/Source/ListView.swift @@ -3297,7 +3297,7 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture var containsSameHeader = false if let nextHeaders = nextItemNode.headers() { nextHeaderSearch: for nextHeader in nextHeaders { - if nextHeader.id == currentId { + if nextHeader.id == currentId && nextHeader.combinesWith(other: currentHeader) { containsSameHeader = true break nextHeaderSearch } @@ -3341,7 +3341,7 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture let flashing = self.headerItemsAreFlashing() - func addHeader(id: VisibleHeaderNodeId, upperBound: CGFloat, upperBoundEdge: CGFloat, lowerBound: CGFloat, item: ListViewItemHeader, hasValidNodes: Bool) { + func addHeader(id: VisibleHeaderNodeId, upperBound: CGFloat, upperIndex: Int, upperBoundEdge: CGFloat, lowerBound: CGFloat, lowerIndex: Int, item: ListViewItemHeader, hasValidNodes: Bool) { let itemHeaderHeight: CGFloat = item.height let headerFrame: CGRect @@ -3364,7 +3364,9 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture visibleHeaderNodes.insert(id) let initialHeaderNodeAlpha = self.itemHeaderNodesAlpha - if let headerNode = self.itemHeaderNodes[id] { + let headerNode: ListViewItemHeaderNode + if let current = self.itemHeaderNodes[id] { + headerNode = current switch transition.0 { case .immediate: headerNode.frame = headerFrame @@ -3410,7 +3412,7 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture } headerNode.updateStickDistanceFactor(stickLocationDistanceFactor, transition: transition.0) } else { - let headerNode = item.node(synchronousLoad: synchronousLoad) + headerNode = item.node(synchronousLoad: synchronousLoad) headerNode.alpha = initialHeaderNodeAlpha if headerNode.item !== item { item.updateNode(headerNode, previous: nil, next: nil) @@ -3432,11 +3434,52 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture } headerNode.updateStickDistanceFactor(stickLocationDistanceFactor, transition: .immediate) } + var maxIntersectionHeight: (CGFloat, Int)? + for i in upperIndex ... lowerIndex { + let itemNode = self.itemNodes[i] + let itemNodeFrame = itemNode.apparentFrame + let intersectionHeight: CGFloat = itemNodeFrame.intersection(headerFrame).height + + if let (currentMaxIntersectionHeight, _) = maxIntersectionHeight { + if currentMaxIntersectionHeight < intersectionHeight { + maxIntersectionHeight = (intersectionHeight, i) + } + } else { + maxIntersectionHeight = (intersectionHeight, i) + } + } + if let (_, i) = maxIntersectionHeight { + let itemNode = self.itemNodes[i] + let itemNodeFrame = itemNode.apparentFrame + + if itemNodeFrame.intersects(headerFrame) { + var updated = false + if let previousItemNode = headerNode.attachedToItemNode { + if previousItemNode !== itemNode { + previousItemNode.attachedHeaderNodes.removeAll(where: { $0 === headerNode }) + updated = true + } + } else { + updated = true + } + if updated { + headerNode.attachedToItemNode = itemNode + itemNode.attachedHeaderNodes.append(headerNode) + itemNode.attachedHeaderNodesUpdated() + } + } + } else { + if let previousItemNode = headerNode.attachedToItemNode { + previousItemNode.attachedHeaderNodes.removeAll(where: { $0 === headerNode }) + headerNode.attachedToItemNode = nil + } + } } - var previousHeaderBySpace: [AnyHashable: (id: VisibleHeaderNodeId, upperBound: CGFloat, upperBoundEdge: CGFloat, lowerBound: CGFloat, item: ListViewItemHeader, hasValidNodes: Bool)] = [:] + var previousHeaderBySpace: [AnyHashable: (id: VisibleHeaderNodeId, upperBound: CGFloat, upperBoundIndex: Int, upperBoundEdge: CGFloat, lowerBound: CGFloat, lowerBoundIndex: Int, item: ListViewItemHeader, hasValidNodes: Bool)] = [:] - for itemNode in self.itemNodes { + for i in 0 ..< self.itemNodes.count { + let itemNode = self.itemNodes[i] let itemFrame = itemNode.apparentFrame let itemTopInset = itemNode.insets.top var validItemHeaderSpaces: [AnyHashable] = [] @@ -3458,16 +3501,16 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture itemMaxY = itemFrame.maxY - (self.rotated ? itemNode.insets.top : itemNode.insets.bottom) } - if let (previousHeaderId, previousUpperBound, previousUpperBoundEdge, previousLowerBound, previousHeaderItem, hasValidNodes) = previousHeaderBySpace[itemHeader.id.space] { + if let (previousHeaderId, previousUpperBound, previousUpperIndex, previousUpperBoundEdge, previousLowerBound, previousLowerIndex, previousHeaderItem, hasValidNodes) = previousHeaderBySpace[itemHeader.id.space] { if previousHeaderId == headerId { - previousHeaderBySpace[itemHeader.id.space] = (previousHeaderId, previousUpperBound, previousUpperBoundEdge, itemMaxY, previousHeaderItem, hasValidNodes || itemNode.index != nil) + previousHeaderBySpace[itemHeader.id.space] = (previousHeaderId, previousUpperBound, previousUpperIndex, previousUpperBoundEdge, itemMaxY, i, previousHeaderItem, hasValidNodes || itemNode.index != nil) } else { - addHeader(id: previousHeaderId, upperBound: previousUpperBound, upperBoundEdge: previousUpperBoundEdge, lowerBound: previousLowerBound, item: previousHeaderItem, hasValidNodes: hasValidNodes) + addHeader(id: previousHeaderId, upperBound: previousUpperBound, upperIndex: previousUpperIndex, upperBoundEdge: previousUpperBoundEdge, lowerBound: previousLowerBound, lowerIndex: previousLowerIndex, item: previousHeaderItem, hasValidNodes: hasValidNodes) - previousHeaderBySpace[itemHeader.id.space] = (headerId, itemFrame.minY, itemFrame.minY + itemTopInset, itemMaxY, itemHeader, itemNode.index != nil) + previousHeaderBySpace[itemHeader.id.space] = (headerId, itemFrame.minY, i, itemFrame.minY + itemTopInset, itemMaxY, i, itemHeader, itemNode.index != nil) } } else { - previousHeaderBySpace[itemHeader.id.space] = (headerId, itemFrame.minY, itemFrame.minY + itemTopInset, itemMaxY, itemHeader, itemNode.index != nil) + previousHeaderBySpace[itemHeader.id.space] = (headerId, itemFrame.minY, i, itemFrame.minY + itemTopInset, itemMaxY, i, itemHeader, itemNode.index != nil) } } } @@ -3477,18 +3520,18 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture continue } - let (previousHeaderId, previousUpperBound, previousUpperBoundEdge, previousLowerBound, previousHeaderItem, hasValidNodes) = previousHeader + let (previousHeaderId, previousUpperBound, previousUpperIndex, previousUpperBoundEdge, previousLowerBound, previousLowerIndex, previousHeaderItem, hasValidNodes) = previousHeader - addHeader(id: previousHeaderId, upperBound: previousUpperBound, upperBoundEdge: previousUpperBoundEdge, lowerBound: previousLowerBound, item: previousHeaderItem, hasValidNodes: hasValidNodes) + addHeader(id: previousHeaderId, upperBound: previousUpperBound, upperIndex: previousUpperIndex, upperBoundEdge: previousUpperBoundEdge, lowerBound: previousLowerBound, lowerIndex: previousLowerIndex, item: previousHeaderItem, hasValidNodes: hasValidNodes) previousHeaderBySpace.removeValue(forKey: space) } } for (space, previousHeader) in previousHeaderBySpace { - let (previousHeaderId, previousUpperBound, previousUpperBoundEdge, previousLowerBound, previousHeaderItem, hasValidNodes) = previousHeader + let (previousHeaderId, previousUpperBound, previousUpperIndex, previousUpperBoundEdge, previousLowerBound, previousLowerIndex, previousHeaderItem, hasValidNodes) = previousHeader - addHeader(id: previousHeaderId, upperBound: previousUpperBound, upperBoundEdge: previousUpperBoundEdge, lowerBound: previousLowerBound, item: previousHeaderItem, hasValidNodes: hasValidNodes) + addHeader(id: previousHeaderId, upperBound: previousUpperBound, upperIndex: previousUpperIndex, upperBoundEdge: previousUpperBoundEdge, lowerBound: previousLowerBound, lowerIndex: previousLowerIndex, item: previousHeaderItem, hasValidNodes: hasValidNodes) previousHeaderBySpace.removeValue(forKey: space) } diff --git a/submodules/Display/Source/ListViewItemHeader.swift b/submodules/Display/Source/ListViewItemHeader.swift index dcbbffb286..6356694670 100644 --- a/submodules/Display/Source/ListViewItemHeader.swift +++ b/submodules/Display/Source/ListViewItemHeader.swift @@ -13,6 +13,8 @@ public protocol ListViewItemHeader: AnyObject { var stickDirection: ListViewItemHeaderStickDirection { get } var height: CGFloat { get } var stickOverInsets: Bool { get } + + func combinesWith(other: ListViewItemHeader) -> Bool func node(synchronousLoad: Bool) -> ListViewItemHeaderNode func updateNode(_ node: ListViewItemHeaderNode, previous: ListViewItemHeader?, next: ListViewItemHeader?) @@ -25,6 +27,7 @@ open class ListViewItemHeaderNode: ASDisplayNode { final private(set) var internalStickLocationDistanceFactor: CGFloat = 0.0 final var internalStickLocationDistance: CGFloat = 0.0 private var isFlashingOnScrolling = false + weak var attachedToItemNode: ListViewItemNode? var item: ListViewItemHeader? diff --git a/submodules/Display/Source/ListViewItemNode.swift b/submodules/Display/Source/ListViewItemNode.swift index 0322282174..8b0803b233 100644 --- a/submodules/Display/Source/ListViewItemNode.swift +++ b/submodules/Display/Source/ListViewItemNode.swift @@ -129,6 +129,11 @@ open class ListViewItemNode: ASDisplayNode, AccessibilityFocusableNode { final var tempHeaderSpaceAffinities: [ListViewItemNode.HeaderId: Int] = [:] final var headerSpaceAffinities: [ListViewItemNode.HeaderId: Int] = [:] + + public internal(set) var attachedHeaderNodes: [ListViewItemHeaderNode] = [] + + open func attachedHeaderNodesUpdated() { + } final let wantsScrollDynamics: Bool diff --git a/submodules/ItemListPeerItem/Sources/ItemListPeerItem.swift b/submodules/ItemListPeerItem/Sources/ItemListPeerItem.swift index 963a1bf731..1e69a77038 100644 --- a/submodules/ItemListPeerItem/Sources/ItemListPeerItem.swift +++ b/submodules/ItemListPeerItem/Sources/ItemListPeerItem.swift @@ -1374,6 +1374,14 @@ public final class ItemListPeerItemHeader: ListViewItemHeader { self.actionTitle = actionTitle self.action = action } + + public func combinesWith(other: ListViewItemHeader) -> Bool { + if let other = other as? ItemListPeerItemHeader, other.id == self.id { + return true + } else { + return false + } + } public func node(synchronousLoad: Bool) -> ListViewItemHeaderNode { return ItemListPeerItemHeaderNode(theme: self.theme, strings: self.strings, text: self.text, additionalText: self.additionalText, actionTitle: self.actionTitle, action: self.action) diff --git a/submodules/ListMessageItem/Sources/ListMessageDateHeader.swift b/submodules/ListMessageItem/Sources/ListMessageDateHeader.swift index 3e95f709ec..a6763f51d6 100644 --- a/submodules/ListMessageItem/Sources/ListMessageDateHeader.swift +++ b/submodules/ListMessageItem/Sources/ListMessageDateHeader.swift @@ -67,6 +67,14 @@ final class ListMessageDateHeader: ListViewItemHeader { let stickOverInsets: Bool = true let height: CGFloat = 28.0 + + public func combinesWith(other: ListViewItemHeader) -> Bool { + if let other = other as? ListMessageDateHeader, other.id == self.id { + return true + } else { + return false + } + } func node(synchronousLoad: Bool) -> ListViewItemHeaderNode { return ListMessageDateHeaderNode(theme: self.theme, strings: self.strings, fontSize: self.fontSize, roundedTimestamp: self.roundedTimestamp, month: self.month, year: self.year) diff --git a/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift index 5234ec6920..6cb1ee9204 100644 --- a/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift @@ -1497,6 +1497,8 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { var bounds = self.bounds bounds.origin.x = -translation.x self.bounds = bounds + + self.updateAttachedAvatarNodeOffset(offset: translation.x, transition: .immediate) if let swipeToReplyNode = self.swipeToReplyNode { swipeToReplyNode.frame = CGRect(origin: CGPoint(x: bounds.size.width, y: floor((self.contentSize.height - 33.0) / 2.0)), size: CGSize(width: 33.0, height: 33.0)) @@ -1532,6 +1534,9 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { bounds.origin.x = 0.0 self.bounds = bounds self.layer.animateBounds(from: previousBounds, to: bounds, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring) + + self.updateAttachedAvatarNodeOffset(offset: 0.0, transition: .animated(duration: 0.3, curve: .spring)) + if let swipeToReplyNode = self.swipeToReplyNode { self.swipeToReplyNode = nil swipeToReplyNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false, completion: { [weak swipeToReplyNode] _ in diff --git a/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift index 2fe41f67bd..ae3f0cc1a0 100644 --- a/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift @@ -3657,6 +3657,8 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode var shadowBounds = self.shadowNode.bounds shadowBounds.origin.x = -translation.x self.shadowNode.bounds = shadowBounds + + self.updateAttachedAvatarNodeOffset(offset: translation.x, transition: .immediate) if let swipeToReplyNode = self.swipeToReplyNode { swipeToReplyNode.frame = CGRect(origin: CGPoint(x: bounds.size.width, y: floor((self.contentSize.height - 33.0) / 2.0)), size: CGSize(width: 33.0, height: 33.0)) @@ -3696,6 +3698,9 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode shadowBounds.origin.x = 0.0 self.shadowNode.bounds = shadowBounds self.layer.animateBounds(from: previousBounds, to: bounds, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring) + + self.updateAttachedAvatarNodeOffset(offset: 0.0, transition: .animated(duration: 0.3, curve: .spring)) + self.shadowNode.layer.animateBounds(from: previousShadowBounds, to: shadowBounds, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring) if let swipeToReplyNode = self.swipeToReplyNode { self.swipeToReplyNode = nil diff --git a/submodules/TelegramUI/Sources/ChatMessageDateHeader.swift b/submodules/TelegramUI/Sources/ChatMessageDateHeader.swift index 67cdf49806..afd4e1a69b 100644 --- a/submodules/TelegramUI/Sources/ChatMessageDateHeader.swift +++ b/submodules/TelegramUI/Sources/ChatMessageDateHeader.swift @@ -42,6 +42,14 @@ final class ChatMessageDateHeader: ListViewItemHeader { let stickOverInsets: Bool = true let height: CGFloat = 34.0 + + public func combinesWith(other: ListViewItemHeader) -> Bool { + if let other = other as? ChatMessageDateHeader, other.id == self.id { + return true + } else { + return false + } + } func node(synchronousLoad: Bool) -> ListViewItemHeaderNode { return ChatMessageDateHeaderNode(localTimestamp: self.roundedTimestamp, scheduled: self.scheduled, presentationData: self.presentationData, context: self.context, action: self.action) @@ -316,14 +324,22 @@ final class ChatMessageAvatarHeader: ListViewItemHeader { let peerId: PeerId let peer: Peer? let messageReference: MessageReference? + let effectiveTimestamp: Int32 let presentationData: ChatPresentationData let context: AccountContext let controllerInteraction: ChatControllerInteraction - init(timestamp: Int32, peerId: PeerId, peer: Peer?, messageReference: MessageReference?, presentationData: ChatPresentationData, context: AccountContext, controllerInteraction: ChatControllerInteraction) { + init(timestamp: Int32, peerId: PeerId, peer: Peer?, messageReference: MessageReference?, message: Message, presentationData: ChatPresentationData, context: AccountContext, controllerInteraction: ChatControllerInteraction) { self.peerId = peerId self.peer = peer self.messageReference = messageReference + + var effectiveTimestamp = message.timestamp + if let forwardInfo = message.forwardInfo, forwardInfo.flags.contains(.isImported) { + effectiveTimestamp = forwardInfo.date + } + self.effectiveTimestamp = effectiveTimestamp + self.presentationData = presentationData self.context = context self.controllerInteraction = controllerInteraction @@ -335,6 +351,17 @@ final class ChatMessageAvatarHeader: ListViewItemHeader { let height: CGFloat = 38.0 + public func combinesWith(other: ListViewItemHeader) -> Bool { + if let other = other as? ChatMessageAvatarHeader, other.id == self.id { + if abs(self.effectiveTimestamp - other.effectiveTimestamp) >= 10 * 60 { + return false + } + return true + } else { + return false + } + } + func node(synchronousLoad: Bool) -> ListViewItemHeaderNode { return ChatMessageAvatarHeaderNode(peerId: self.peerId, peer: self.peer, messageReference: self.messageReference, presentationData: self.presentationData, context: self.context, controllerInteraction: self.controllerInteraction, synchronousLoad: synchronousLoad) } diff --git a/submodules/TelegramUI/Sources/ChatMessageInstantVideoItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageInstantVideoItemNode.swift index 77d2bd9eb0..e35dd7516d 100644 --- a/submodules/TelegramUI/Sources/ChatMessageInstantVideoItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageInstantVideoItemNode.swift @@ -913,6 +913,8 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD var bounds = self.bounds bounds.origin.x = -translation.x self.bounds = bounds + + self.updateAttachedAvatarNodeOffset(offset: translation.x, transition: .immediate) if let swipeToReplyNode = self.swipeToReplyNode { swipeToReplyNode.frame = CGRect(origin: CGPoint(x: bounds.size.width, y: floor((self.contentSize.height - 33.0) / 2.0)), size: CGSize(width: 33.0, height: 33.0)) @@ -948,6 +950,9 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD bounds.origin.x = 0.0 self.bounds = bounds self.layer.animateBounds(from: previousBounds, to: bounds, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring) + + self.updateAttachedAvatarNodeOffset(offset: 0.0, transition: .animated(duration: 0.3, curve: .spring)) + if let swipeToReplyNode = self.swipeToReplyNode { self.swipeToReplyNode = nil swipeToReplyNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false, completion: { [weak swipeToReplyNode] _ in diff --git a/submodules/TelegramUI/Sources/ChatMessageItem.swift b/submodules/TelegramUI/Sources/ChatMessageItem.swift index e10982a736..fc9b4e2388 100644 --- a/submodules/TelegramUI/Sources/ChatMessageItem.swift +++ b/submodules/TelegramUI/Sources/ChatMessageItem.swift @@ -357,7 +357,7 @@ public final class ChatMessageItem: ListViewItem, CustomStringConvertible { if !hasActionMedia && !isBroadcastChannel { if let effectiveAuthor = effectiveAuthor { //accessoryItem = ChatMessageAvatarAccessoryItem(context: context, peerId: effectiveAuthor.id, peer: effectiveAuthor, messageReference: MessageReference(message), messageTimestamp: content.index.timestamp, forwardInfo: message.forwardInfo, emptyColor: presentationData.theme.theme.chat.message.incoming.bubble.withoutWallpaper.fill, controllerInteraction: controllerInteraction) - avatarHeader = ChatMessageAvatarHeader(timestamp: content.index.timestamp, peerId: effectiveAuthor.id, peer: effectiveAuthor, messageReference: MessageReference(message), presentationData: presentationData, context: context, controllerInteraction: controllerInteraction) + avatarHeader = ChatMessageAvatarHeader(timestamp: content.index.timestamp, peerId: effectiveAuthor.id, peer: effectiveAuthor, messageReference: MessageReference(message), message: message, presentationData: presentationData, context: context, controllerInteraction: controllerInteraction) } } } diff --git a/submodules/TelegramUI/Sources/ChatMessageItemView.swift b/submodules/TelegramUI/Sources/ChatMessageItemView.swift index 0a198e1cba..ae3870994d 100644 --- a/submodules/TelegramUI/Sources/ChatMessageItemView.swift +++ b/submodules/TelegramUI/Sources/ChatMessageItemView.swift @@ -874,4 +874,18 @@ public class ChatMessageItemView: ListViewItemNode { func getStatusNode() -> ASDisplayNode? { return nil } + + private var attachedAvatarNodeOffset: CGFloat = 0.0 + + override public func attachedHeaderNodesUpdated() { + self.updateAttachedAvatarNodeOffset(offset: self.attachedAvatarNodeOffset, transition: .immediate) + } + + func updateAttachedAvatarNodeOffset(offset: CGFloat, transition: ContainedViewLayoutTransition) { + for headerNode in self.attachedHeaderNodes { + if let headerNode = headerNode as? ChatMessageAvatarHeaderNode { + transition.updateSublayerTransformOffset(layer: headerNode.layer, offset: CGPoint(x: offset, y: 0.0)) + } + } + } } diff --git a/submodules/TelegramUI/Sources/ChatMessageStickerItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageStickerItemNode.swift index f9258990f0..35aa60b1d2 100644 --- a/submodules/TelegramUI/Sources/ChatMessageStickerItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageStickerItemNode.swift @@ -1017,6 +1017,8 @@ class ChatMessageStickerItemNode: ChatMessageItemView { var bounds = self.bounds bounds.origin.x = -translation.x self.bounds = bounds + + self.updateAttachedAvatarNodeOffset(offset: translation.x, transition: .immediate) if let swipeToReplyNode = self.swipeToReplyNode { swipeToReplyNode.frame = CGRect(origin: CGPoint(x: bounds.size.width, y: floor((self.contentSize.height - 33.0) / 2.0)), size: CGSize(width: 33.0, height: 33.0)) @@ -1052,6 +1054,9 @@ class ChatMessageStickerItemNode: ChatMessageItemView { bounds.origin.x = 0.0 self.bounds = bounds self.layer.animateBounds(from: previousBounds, to: bounds, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring) + + self.updateAttachedAvatarNodeOffset(offset: 0.0, transition: .animated(duration: 0.3, curve: .spring)) + if let swipeToReplyNode = self.swipeToReplyNode { self.swipeToReplyNode = nil swipeToReplyNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false, completion: { [weak swipeToReplyNode] _ in