diff --git a/submodules/SettingsUI/Sources/Privacy and Security/ForwardPrivacyChatPreviewItem.swift b/submodules/SettingsUI/Sources/Privacy and Security/ForwardPrivacyChatPreviewItem.swift index 825a4e7b3d..8bce683aec 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/ForwardPrivacyChatPreviewItem.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/ForwardPrivacyChatPreviewItem.swift @@ -181,7 +181,7 @@ class ForwardPrivacyChatPreviewItemNode: ListViewItemNode { var authorNameCenter: CGFloat? - let forwardedString = item.strings.Message_ForwardedMessage("").string + let forwardedString = item.strings.Message_ForwardedMessageShort("").string var fromString: String? if let newlineRange = forwardedString.range(of: "\n") { let from = forwardedString[newlineRange.upperBound...] diff --git a/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift index b85904187c..c4cce70b20 100644 --- a/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift @@ -191,14 +191,12 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { var telegramDice: TelegramMediaDice? private let disposable = MetaDisposable() private let disposables = DisposableSet() - - private var forwardInfoNode: ChatMessageForwardInfoNode? - private var forwardBackgroundNode: NavigationBackgroundNode? - + private var viaBotNode: TextNode? private let dateAndStatusNode: ChatMessageDateAndStatusNode private var replyInfoNode: ChatMessageReplyInfoNode? private var replyBackgroundNode: NavigationBackgroundNode? + private var forwardInfoNode: ChatMessageForwardInfoNode? private var actionButtonsNode: ChatMessageActionButtonsNode? private var reactionButtonsNode: ChatMessageReactionButtonsNode? @@ -991,11 +989,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } } } - - if replyInfoApply != nil || viaBotApply != nil { - needsReplyBackground = true - } - + var updatedShareButtonNode: ChatMessageShareButton? if needsShareButton { if let currentShareButtonNode = currentShareButtonNode { @@ -1013,7 +1007,6 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { var forwardPsaType: String? var forwardInfoSizeApply: (CGSize, (CGFloat) -> ChatMessageForwardInfoNode)? - var needsForwardBackground = false if !ignoreForward, let forwardInfo = item.message.forwardInfo { forwardPsaType = forwardInfo.psaType @@ -1038,8 +1031,10 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } let availableWidth = max(60.0, availableContentWidth + 6.0) forwardInfoSizeApply = makeForwardInfoLayout(item.presentationData, item.presentationData.strings, .standalone, forwardSource, forwardAuthorSignature, forwardPsaType, CGSize(width: availableWidth, height: CGFloat.greatestFiniteMagnitude)) - - needsForwardBackground = true + } + + if replyInfoApply != nil || viaBotApply != nil || forwardInfoSizeApply != nil { + needsReplyBackground = true } var maxContentWidth = imageSize.width @@ -1194,22 +1189,59 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { replyBackgroundNode.removeFromSupernode() } - if let (viaBotLayout, viaBotApply) = viaBotApply { + var messageInfoSize = CGSize() + if let (viaBotLayout, _) = viaBotApply, forwardInfoSizeApply == nil { + messageInfoSize = CGSize(width: viaBotLayout.size.width + 1.0, height: 0.0) + } + if let (forwardInfoSize, _) = forwardInfoSizeApply { + messageInfoSize = CGSize(width: max(messageInfoSize.width, forwardInfoSize.width + 2.0), height: 0.0) + } + if let (replyInfoSize, _) = replyInfoApply { + messageInfoSize = CGSize(width: max(messageInfoSize.width, replyInfoSize.width), height: 0.0) + } + + if let (viaBotLayout, viaBotApply) = viaBotApply, forwardInfoSizeApply == nil { let viaBotNode = viaBotApply() if strongSelf.viaBotNode == nil { strongSelf.viaBotNode = viaBotNode strongSelf.contextSourceNode.contentNode.addSubnode(viaBotNode) } - let viaBotFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 15.0) : (params.width - params.rightInset - viaBotLayout.size.width - layoutConstants.bubble.edgeInset - 14.0)), y: 8.0), size: viaBotLayout.size) + let viaBotFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 11.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 9.0)), y: 8.0), size: viaBotLayout.size) viaBotNode.frame = viaBotFrame - if let replyBackgroundNode = strongSelf.replyBackgroundNode { - replyBackgroundNode.frame = CGRect(origin: CGPoint(x: viaBotFrame.minX - 6.0, y: viaBotFrame.minY - 2.0 - UIScreenPixel), size: CGSize(width: viaBotFrame.size.width + 11.0, height: viaBotFrame.size.height + 5.0)) - replyBackgroundNode.update(size: replyBackgroundNode.bounds.size, cornerRadius: 8.0, transition: .immediate) - } + + messageInfoSize = CGSize(width: messageInfoSize.width, height: viaBotLayout.size.height) } else if let viaBotNode = strongSelf.viaBotNode { viaBotNode.removeFromSupernode() strongSelf.viaBotNode = nil } + + if let (forwardInfoSize, forwardInfoApply) = forwardInfoSizeApply { + let forwardInfoNode = forwardInfoApply(forwardInfoSize.width) + if strongSelf.forwardInfoNode == nil { + strongSelf.forwardInfoNode = forwardInfoNode + strongSelf.contextSourceNode.contentNode.addSubnode(forwardInfoNode) + + if animation.isAnimated { + forwardInfoNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + } + } + let forwardInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 12.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 8.0)), y: 8.0 + messageInfoSize.height), size: forwardInfoSize) + forwardInfoNode.frame = forwardInfoFrame + + messageInfoSize = CGSize(width: messageInfoSize.width, height: messageInfoSize.height + forwardInfoSize.height - 1.0) + } else if let forwardInfoNode = strongSelf.forwardInfoNode { + if animation.isAnimated { + if let forwardInfoNode = strongSelf.forwardInfoNode { + strongSelf.forwardInfoNode = nil + forwardInfoNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak forwardInfoNode] _ in + forwardInfoNode?.removeFromSupernode() + }) + } + } else { + forwardInfoNode.removeFromSupernode() + strongSelf.forwardInfoNode = nil + } + } if let (replyInfoSize, replyInfoApply) = replyInfoApply { let replyInfoNode = replyInfoApply() @@ -1217,31 +1249,29 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { strongSelf.replyInfoNode = replyInfoNode strongSelf.contextSourceNode.contentNode.addSubnode(replyInfoNode) } - var viaBotSize = CGSize() - if let viaBotNode = strongSelf.viaBotNode { - viaBotSize = viaBotNode.frame.size - } - let replyInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 10.0) : (params.width - params.rightInset - max(replyInfoSize.width, viaBotSize.width) - layoutConstants.bubble.edgeInset - 10.0)), y: 8.0 + viaBotSize.height), size: replyInfoSize) - if let viaBotNode = strongSelf.viaBotNode { - if replyInfoFrame.minX < viaBotNode.frame.minX { - viaBotNode.frame = viaBotNode.frame.offsetBy(dx: replyInfoFrame.minX - viaBotNode.frame.minX, dy: 0.0) - } - } + let replyInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 11.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 9.0)), y: 8.0 + messageInfoSize.height), size: replyInfoSize) replyInfoNode.frame = replyInfoFrame - if let replyBackgroundNode = strongSelf.replyBackgroundNode { - replyBackgroundNode.frame = CGRect(origin: CGPoint(x: replyInfoFrame.minX - 4.0, y: replyInfoFrame.minY - viaBotSize.height - 2.0), size: CGSize(width: max(replyInfoFrame.size.width, viaBotSize.width) + 8.0, height: replyInfoFrame.size.height + viaBotSize.height + 5.0)) - replyBackgroundNode.update(size: replyBackgroundNode.bounds.size, cornerRadius: 8.0, transition: .immediate) - } - if let _ = item.controllerInteraction.selectionState, isEmoji { - replyInfoNode.alpha = 0.0 - strongSelf.replyBackgroundNode?.alpha = 0.0 - } + messageInfoSize = CGSize(width: max(messageInfoSize.width, replyInfoSize.width), height: messageInfoSize.height + replyInfoSize.height) } else if let replyInfoNode = strongSelf.replyInfoNode { replyInfoNode.removeFromSupernode() strongSelf.replyInfoNode = nil } + + if let replyBackgroundNode = strongSelf.replyBackgroundNode { + replyBackgroundNode.frame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 10.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 10.0)) - 4.0, y: 6.0), size: CGSize(width: messageInfoSize.width + 8.0, height: messageInfoSize.height + 5.0)) + + let cornerRadius = replyBackgroundNode.frame.height <= 22.0 ? replyBackgroundNode.frame.height / 2.0 : 8.0 + replyBackgroundNode.update(size: replyBackgroundNode.bounds.size, cornerRadius: cornerRadius, transition: .immediate) + } + + let panelsAlpha: CGFloat = item.controllerInteraction.selectionState == nil ? 1.0 : 0.0 + strongSelf.replyInfoNode?.alpha = panelsAlpha + strongSelf.viaBotNode?.alpha = panelsAlpha + strongSelf.forwardInfoNode?.alpha = panelsAlpha + strongSelf.replyBackgroundNode?.alpha = panelsAlpha + if isFailed { let deliveryFailedNode: ChatMessageDeliveryFailedNode var isAppearing = false @@ -1272,61 +1302,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { deliveryFailedNode?.removeFromSupernode() }) } - - if needsForwardBackground { - if let forwardBackgroundNode = strongSelf.forwardBackgroundNode { - forwardBackgroundNode.updateColor(color: selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), enableBlur: dateFillNeedsBlur(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), transition: .immediate) - } else { - let forwardBackgroundNode = NavigationBackgroundNode(color: selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), enableBlur: dateFillNeedsBlur(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper)) - strongSelf.forwardBackgroundNode = forwardBackgroundNode - strongSelf.contextSourceNode.contentNode.addSubnode(forwardBackgroundNode) - - if animation.isAnimated { - forwardBackgroundNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) - } - } - } else if let forwardBackgroundNode = strongSelf.forwardBackgroundNode { - if animation.isAnimated { - strongSelf.forwardBackgroundNode = nil - forwardBackgroundNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak forwardBackgroundNode] _ in - forwardBackgroundNode?.removeFromSupernode() - }) - } else { - forwardBackgroundNode.removeFromSupernode() - strongSelf.forwardBackgroundNode = nil - } - } - - if let (forwardInfoSize, forwardInfoApply) = forwardInfoSizeApply { - let forwardInfoNode = forwardInfoApply(forwardInfoSize.width) - if strongSelf.forwardInfoNode == nil { - strongSelf.forwardInfoNode = forwardInfoNode - strongSelf.contextSourceNode.contentNode.addSubnode(forwardInfoNode) - - if animation.isAnimated { - forwardInfoNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) - } - } - let forwardInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 12.0) : (params.width - params.rightInset - forwardInfoSize.width - layoutConstants.bubble.edgeInset - 12.0)), y: 8.0), size: forwardInfoSize) - forwardInfoNode.frame = forwardInfoFrame - if let forwardBackgroundNode = strongSelf.forwardBackgroundNode { - forwardBackgroundNode.frame = CGRect(origin: CGPoint(x: forwardInfoFrame.minX - 6.0, y: forwardInfoFrame.minY - 2.0), size: CGSize(width: forwardInfoFrame.size.width + 10.0, height: forwardInfoFrame.size.height + 4.0)) - forwardBackgroundNode.update(size: forwardBackgroundNode.bounds.size, cornerRadius: 8.0, transition: .immediate) - } - } else if let forwardInfoNode = strongSelf.forwardInfoNode { - if animation.isAnimated { - if let forwardInfoNode = strongSelf.forwardInfoNode { - strongSelf.forwardInfoNode = nil - forwardInfoNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak forwardInfoNode] _ in - forwardInfoNode?.removeFromSupernode() - }) - } - } else { - forwardInfoNode.removeFromSupernode() - strongSelf.forwardInfoNode = nil - } - } - + if let actionButtonsSizeAndApply = actionButtonsSizeAndApply { let actionButtonsNode = actionButtonsSizeAndApply.1(animation) let previousFrame = actionButtonsNode.frame @@ -2057,12 +2033,18 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } let transition: ContainedViewLayoutTransition = animated ? .animated(duration: 0.2, curve: .easeInOut) : .immediate - let replyAlpha: CGFloat = item.controllerInteraction.selectionState == nil ? 1.0 : 0.0 + let panelsAlpha: CGFloat = item.controllerInteraction.selectionState == nil ? 1.0 : 0.0 if let replyInfoNode = self.replyInfoNode { - transition.updateAlpha(node: replyInfoNode, alpha: replyAlpha) + transition.updateAlpha(node: replyInfoNode, alpha: panelsAlpha) + } + if let viaBotNode = self.viaBotNode { + transition.updateAlpha(node: viaBotNode, alpha: panelsAlpha) + } + if let forwardInfoNode = self.forwardInfoNode { + transition.updateAlpha(node: forwardInfoNode, alpha: panelsAlpha) } if let replyBackgroundNode = self.replyBackgroundNode { - transition.updateAlpha(node: replyBackgroundNode, alpha: replyAlpha) + transition.updateAlpha(node: replyBackgroundNode, alpha: panelsAlpha) } if let selectionState = item.controllerInteraction.selectionState { diff --git a/submodules/TelegramUI/Sources/ChatMessageForwardInfoNode.swift b/submodules/TelegramUI/Sources/ChatMessageForwardInfoNode.swift index fc6bc9c4fb..880b7a3d38 100644 --- a/submodules/TelegramUI/Sources/ChatMessageForwardInfoNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageForwardInfoNode.swift @@ -148,7 +148,7 @@ class ChatMessageForwardInfoNode: ASDisplayNode { } } else { titleColor = incoming ? presentationData.theme.theme.chat.message.incoming.accentTextColor : presentationData.theme.theme.chat.message.outgoing.accentTextColor - completeSourceString = strings.Message_ForwardedMessage(peerString) + completeSourceString = strings.Message_ForwardedMessageShort(peerString) } case .standalone: let serviceColor = serviceMessageColorComponents(theme: presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) diff --git a/submodules/TelegramUI/Sources/ChatMessageInstantVideoItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageInstantVideoItemNode.swift index 73e28679f5..c4a7aac36d 100644 --- a/submodules/TelegramUI/Sources/ChatMessageInstantVideoItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageInstantVideoItemNode.swift @@ -42,12 +42,10 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD return self.apparentHeightTransition != nil } - private var forwardInfoNode: ChatMessageForwardInfoNode? - private var forwardBackgroundNode: NavigationBackgroundNode? - private var viaBotNode: TextNode? private var replyInfoNode: ChatMessageReplyInfoNode? private var replyBackgroundNode: NavigationBackgroundNode? + private var forwardInfoNode: ChatMessageForwardInfoNode? private var actionButtonsNode: ChatMessageActionButtonsNode? private var reactionButtonsNode: ChatMessageReactionButtonsNode? @@ -259,7 +257,6 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD let currentShareButtonNode = self.shareButtonNode let makeForwardInfoLayout = ChatMessageForwardInfoNode.asyncLayout(self.forwardInfoNode) - let currentForwardBackgroundNode = self.forwardBackgroundNode let actionButtonsLayout = ChatMessageActionButtonsNode.asyncLayout(self.actionButtonsNode) let reactionButtonsLayout = ChatMessageReactionButtonsNode.asyncLayout(self.reactionButtonsNode) @@ -472,17 +469,7 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD replyMarkup = attribute } } - - if replyInfoApply != nil || viaBotApply != nil { - if let currentReplyBackgroundNode = currentReplyBackgroundNode { - updatedReplyBackgroundNode = currentReplyBackgroundNode - } else { - updatedReplyBackgroundNode = NavigationBackgroundNode(color: selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), enableBlur: dateFillNeedsBlur(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper)) - } - - updatedReplyBackgroundNode?.updateColor(color: selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), enableBlur: dateFillNeedsBlur(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), transition: .immediate) - } - + var updatedShareButtonNode: ChatMessageShareButton? if needsShareButton { if currentShareButtonNode != nil { @@ -499,7 +486,6 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD var forwardAuthorSignature: String? var forwardInfoSizeApply: (CGSize, (CGFloat) -> ChatMessageForwardInfoNode)? - var updatedForwardBackgroundNode: NavigationBackgroundNode? if !ignoreForward, let forwardInfo = item.message.forwardInfo { let forwardPsaType = forwardInfo.psaType @@ -524,14 +510,16 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD } let availableWidth = max(60.0, availableContentWidth - normalDisplaySize.width + 6.0) forwardInfoSizeApply = makeForwardInfoLayout(item.presentationData, item.presentationData.strings, .standalone, forwardSource, forwardAuthorSignature, forwardPsaType, CGSize(width: availableWidth, height: CGFloat.greatestFiniteMagnitude)) - - if let currentForwardBackgroundNode = currentForwardBackgroundNode { - updatedForwardBackgroundNode = currentForwardBackgroundNode + } + + if replyInfoApply != nil || viaBotApply != nil || forwardInfoSizeApply != nil { + if let currentReplyBackgroundNode = currentReplyBackgroundNode { + updatedReplyBackgroundNode = currentReplyBackgroundNode } else { - updatedForwardBackgroundNode = NavigationBackgroundNode(color: selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), enableBlur: dateFillNeedsBlur(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper)) + updatedReplyBackgroundNode = NavigationBackgroundNode(color: selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), enableBlur: dateFillNeedsBlur(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper)) } - updatedForwardBackgroundNode?.updateColor(color: selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), enableBlur: dateFillNeedsBlur(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), transition: .immediate) + updatedReplyBackgroundNode?.updateColor(color: selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), enableBlur: dateFillNeedsBlur(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), transition: .immediate) } var maxContentWidth = normalDisplaySize.width @@ -657,21 +645,59 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD strongSelf.replyBackgroundNode = nil } - if let (viaBotLayout, viaBotApply) = viaBotApply { + var messageInfoSize = CGSize() + if let (viaBotLayout, _) = viaBotApply, forwardInfoSizeApply == nil { + messageInfoSize = CGSize(width: viaBotLayout.size.width + 1.0, height: 0.0) + } + if let (forwardInfoSize, _) = forwardInfoSizeApply { + messageInfoSize = CGSize(width: max(messageInfoSize.width, forwardInfoSize.width + 2.0), height: 0.0) + } + if let (replyInfoSize, _) = replyInfoApply { + messageInfoSize = CGSize(width: max(messageInfoSize.width, replyInfoSize.width), height: 0.0) + } + + if let (viaBotLayout, viaBotApply) = viaBotApply, forwardInfoSizeApply == nil { let viaBotNode = viaBotApply() if strongSelf.viaBotNode == nil { strongSelf.viaBotNode = viaBotNode strongSelf.contextSourceNode.contentNode.addSubnode(viaBotNode) } - let viaBotFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 10.0) : (params.width - params.rightInset - viaBotLayout.size.width - layoutConstants.bubble.edgeInset - 10.0)), y: 8.0), size: viaBotLayout.size) + let viaBotFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 11.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 9.0)), y: 8.0), size: viaBotLayout.size) viaBotNode.frame = viaBotFrame - let replyBackgroundFrame = CGRect(origin: CGPoint(x: viaBotFrame.minX - 4.0, y: viaBotFrame.minY - 2.0), size: CGSize(width: viaBotFrame.size.width + 8.0, height: viaBotFrame.size.height + 5.0)) - strongSelf.replyBackgroundNode?.frame = replyBackgroundFrame - strongSelf.replyBackgroundNode?.update(size: replyBackgroundFrame.size, cornerRadius: 8.0, transition: .immediate) + + messageInfoSize = CGSize(width: messageInfoSize.width, height: viaBotLayout.size.height) } else if let viaBotNode = strongSelf.viaBotNode { viaBotNode.removeFromSupernode() strongSelf.viaBotNode = nil } + + if let (forwardInfoSize, forwardInfoApply) = forwardInfoSizeApply { + let forwardInfoNode = forwardInfoApply(forwardInfoSize.width) + if strongSelf.forwardInfoNode == nil { + strongSelf.forwardInfoNode = forwardInfoNode + strongSelf.contextSourceNode.contentNode.addSubnode(forwardInfoNode) + + if animation.isAnimated { + forwardInfoNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + } + } + let forwardInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 12.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 8.0)), y: 8.0 + messageInfoSize.height), size: forwardInfoSize) + forwardInfoNode.frame = forwardInfoFrame + + messageInfoSize = CGSize(width: messageInfoSize.width, height: messageInfoSize.height + forwardInfoSize.height - 1.0) + } else if let forwardInfoNode = strongSelf.forwardInfoNode { + if animation.isAnimated { + if let forwardInfoNode = strongSelf.forwardInfoNode { + strongSelf.forwardInfoNode = nil + forwardInfoNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak forwardInfoNode] _ in + forwardInfoNode?.removeFromSupernode() + }) + } + } else { + forwardInfoNode.removeFromSupernode() + strongSelf.forwardInfoNode = nil + } + } if let (replyInfoSize, replyInfoApply) = replyInfoApply { let replyInfoNode = replyInfoApply() @@ -679,25 +705,23 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD strongSelf.replyInfoNode = replyInfoNode strongSelf.contextSourceNode.contentNode.addSubnode(replyInfoNode) } - var viaBotSize = CGSize() - if let viaBotNode = strongSelf.viaBotNode { - viaBotSize = viaBotNode.frame.size - } - let replyInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 10.0) : (params.width - params.rightInset - max(replyInfoSize.width, viaBotSize.width) - layoutConstants.bubble.edgeInset - 10.0)), y: 8.0 + viaBotSize.height), size: replyInfoSize) - if let viaBotNode = strongSelf.viaBotNode { - if replyInfoFrame.minX < viaBotNode.frame.minX { - viaBotNode.frame = viaBotNode.frame.offsetBy(dx: replyInfoFrame.minX - viaBotNode.frame.minX, dy: 0.0) - } - } + let replyInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 11.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 9.0)), y: 8.0 + messageInfoSize.height), size: replyInfoSize) replyInfoNode.frame = replyInfoFrame - let replyBackgroundFrame = CGRect(origin: CGPoint(x: replyInfoFrame.minX - 4.0, y: replyInfoFrame.minY - viaBotSize.height - 2.0), size: CGSize(width: max(replyInfoFrame.size.width, viaBotSize.width) + 8.0, height: replyInfoFrame.size.height + viaBotSize.height + 5.0)) - strongSelf.replyBackgroundNode?.frame = replyBackgroundFrame - strongSelf.replyBackgroundNode?.update(size: replyBackgroundFrame.size, cornerRadius: 8.0, transition: .immediate) + + messageInfoSize = CGSize(width: max(messageInfoSize.width, replyInfoSize.width), height: messageInfoSize.height + replyInfoSize.height) } else if let replyInfoNode = strongSelf.replyInfoNode { replyInfoNode.removeFromSupernode() strongSelf.replyInfoNode = nil } + + if let replyBackgroundNode = strongSelf.replyBackgroundNode { + replyBackgroundNode.frame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 10.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 10.0)) - 4.0, y: 6.0), size: CGSize(width: messageInfoSize.width + 8.0, height: messageInfoSize.height + 5.0)) + + let cornerRadius = replyBackgroundNode.frame.height <= 22.0 ? replyBackgroundNode.frame.height / 2.0 : 8.0 + replyBackgroundNode.update(size: replyBackgroundNode.bounds.size, cornerRadius: cornerRadius, transition: .immediate) + } + if isFailed { let deliveryFailedNode: ChatMessageDeliveryFailedNode var isAppearing = false @@ -728,63 +752,7 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD deliveryFailedNode?.removeFromSupernode() }) } - - if let updatedForwardBackgroundNode = updatedForwardBackgroundNode { - if strongSelf.forwardBackgroundNode == nil { - strongSelf.forwardBackgroundNode = updatedForwardBackgroundNode - strongSelf.contextSourceNode.contentNode.addSubnode(updatedForwardBackgroundNode) - - if animation.isAnimated { - updatedForwardBackgroundNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) - } - } - } else if let forwardBackgroundNode = strongSelf.forwardBackgroundNode { - if animation.isAnimated { - strongSelf.forwardBackgroundNode = nil - forwardBackgroundNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak forwardBackgroundNode] _ in - forwardBackgroundNode?.removeFromSupernode() - }) - } else { - forwardBackgroundNode.removeFromSupernode() - strongSelf.forwardBackgroundNode = nil - } - } - - if let (forwardInfoSize, forwardInfoApply) = forwardInfoSizeApply { - let forwardInfoNode = forwardInfoApply(forwardInfoSize.width) - if strongSelf.forwardInfoNode == nil { - strongSelf.forwardInfoNode = forwardInfoNode - strongSelf.contextSourceNode.contentNode.addSubnode(forwardInfoNode) - forwardInfoNode.openPsa = { [weak strongSelf] type, sourceNode in - guard let strongSelf = strongSelf, let item = strongSelf.item else { - return - } - item.controllerInteraction.displayPsa(type, sourceNode) - } - - if animation.isAnimated { - forwardInfoNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) - } - } - let forwardInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 12.0) : (params.width - params.rightInset - forwardInfoSize.width - layoutConstants.bubble.edgeInset - 12.0)), y: 8.0), size: forwardInfoSize) - forwardInfoNode.frame = forwardInfoFrame - let forwardBackgroundFrame = CGRect(origin: CGPoint(x: forwardInfoFrame.minX - 6.0, y: forwardInfoFrame.minY - 2.0), size: CGSize(width: forwardInfoFrame.size.width + 10.0, height: forwardInfoFrame.size.height + 4.0)) - strongSelf.forwardBackgroundNode?.frame = forwardBackgroundFrame - strongSelf.forwardBackgroundNode?.update(size: forwardBackgroundFrame.size, cornerRadius: 8.0, transition: .immediate) - } else if let forwardInfoNode = strongSelf.forwardInfoNode { - if animation.isAnimated { - if let forwardInfoNode = strongSelf.forwardInfoNode { - strongSelf.forwardInfoNode = nil - forwardInfoNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak forwardInfoNode] _ in - forwardInfoNode?.removeFromSupernode() - }) - } - } else { - forwardInfoNode.removeFromSupernode() - strongSelf.forwardInfoNode = nil - } - } - + if let reactionButtonsSizeAndApply = reactionButtonsSizeAndApply { let reactionButtonsNode = reactionButtonsSizeAndApply.1(animation) var reactionButtonsFrame = CGRect(origin: CGPoint(x: videoFrame.minX, y: videoFrame.maxY + 6.0), size: reactionButtonsSizeAndApply.0) @@ -869,9 +837,6 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD } let transition = ContainedViewLayoutTransition.animated(duration: 0.2, curve: .easeInOut) - if let forwardBackgroundNode = strongSelf.forwardBackgroundNode { - transition.updateAlpha(node: forwardBackgroundNode, alpha: isPlaying ? 0.0 : 1.0) - } if let replyBackgroundNode = strongSelf.replyBackgroundNode { transition.updateAlpha(node: replyBackgroundNode, alpha: isPlaying ? 0.0 : 1.0) } @@ -1312,28 +1277,28 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD shareButtonNode.frame = CGRect(origin: CGPoint(x: min(params.width - buttonSize.width - 8.0, videoFrame.maxX - 7.0), y: videoFrame.maxY - 24.0 - buttonSize.height), size: buttonSize) } - if let viaBotNode = self.viaBotNode { - let viaBotLayout = viaBotNode.frame - let viaBotFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 10.0) : (params.width - params.rightInset - viaBotLayout.size.width - layoutConstants.bubble.edgeInset - 10.0)), y: 8.0), size: viaBotLayout.size) - viaBotNode.frame = viaBotFrame - self.replyBackgroundNode?.frame = CGRect(origin: CGPoint(x: viaBotFrame.minX - 4.0, y: viaBotFrame.minY - 2.0), size: CGSize(width: viaBotFrame.size.width + 8.0, height: viaBotFrame.size.height + 5.0)) - } - - if let replyInfoNode = self.replyInfoNode { - var viaBotSize = CGSize() - if let viaBotNode = self.viaBotNode { - viaBotSize = viaBotNode.frame.size - } - let replyInfoSize = replyInfoNode.frame.size - let replyInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 10.0) : (params.width - params.rightInset - max(replyInfoSize.width, viaBotSize.width) - layoutConstants.bubble.edgeInset - 10.0)), y: 8.0 + viaBotSize.height), size: replyInfoSize) - if let viaBotNode = self.viaBotNode { - if replyInfoFrame.minX < viaBotNode.frame.minX { - viaBotNode.frame = viaBotNode.frame.offsetBy(dx: replyInfoFrame.minX - viaBotNode.frame.minX, dy: 0.0) - } - } - replyInfoNode.frame = replyInfoFrame - self.replyBackgroundNode?.frame = CGRect(origin: CGPoint(x: replyInfoFrame.minX - 4.0, y: replyInfoFrame.minY - viaBotSize.height - 2.0), size: CGSize(width: max(replyInfoFrame.size.width, viaBotSize.width) + 8.0, height: replyInfoFrame.size.height + viaBotSize.height + 5.0)) - } +// if let viaBotNode = self.viaBotNode { +// let viaBotLayout = viaBotNode.frame +// let viaBotFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 10.0) : (params.width - params.rightInset - viaBotLayout.size.width - layoutConstants.bubble.edgeInset - 10.0)), y: 8.0), size: viaBotLayout.size) +// viaBotNode.frame = viaBotFrame +// self.replyBackgroundNode?.frame = CGRect(origin: CGPoint(x: viaBotFrame.minX - 4.0, y: viaBotFrame.minY - 2.0), size: CGSize(width: viaBotFrame.size.width + 8.0, height: viaBotFrame.size.height + 5.0)) +// } +// +// if let replyInfoNode = self.replyInfoNode { +// var viaBotSize = CGSize() +// if let viaBotNode = self.viaBotNode { +// viaBotSize = viaBotNode.frame.size +// } +// let replyInfoSize = replyInfoNode.frame.size +// let replyInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 10.0) : (params.width - params.rightInset - max(replyInfoSize.width, viaBotSize.width) - layoutConstants.bubble.edgeInset - 10.0)), y: 8.0 + viaBotSize.height), size: replyInfoSize) +// if let viaBotNode = self.viaBotNode { +// if replyInfoFrame.minX < viaBotNode.frame.minX { +// viaBotNode.frame = viaBotNode.frame.offsetBy(dx: replyInfoFrame.minX - viaBotNode.frame.minX, dy: 0.0) +// } +// } +// replyInfoNode.frame = replyInfoFrame +// self.replyBackgroundNode?.frame = CGRect(origin: CGPoint(x: replyInfoFrame.minX - 4.0, y: replyInfoFrame.minY - viaBotSize.height - 2.0), size: CGSize(width: max(replyInfoFrame.size.width, viaBotSize.width) + 8.0, height: replyInfoFrame.size.height + viaBotSize.height + 5.0)) +// } if let deliveryFailedNode = self.deliveryFailedNode { let deliveryFailedSize = deliveryFailedNode.frame.size @@ -1341,12 +1306,11 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD deliveryFailedNode.frame = deliveryFailedFrame } - if let forwardInfoNode = self.forwardInfoNode { - let forwardInfoSize = forwardInfoNode.frame.size - let forwardInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 12.0) : (params.width - params.rightInset - forwardInfoSize.width - layoutConstants.bubble.edgeInset - 12.0)), y: 8.0), size: forwardInfoSize) - forwardInfoNode.frame = forwardInfoFrame - self.forwardBackgroundNode?.frame = CGRect(origin: CGPoint(x: forwardInfoFrame.minX - 6.0, y: forwardInfoFrame.minY - 2.0), size: CGSize(width: forwardInfoFrame.size.width + 10.0, height: forwardInfoFrame.size.height + 4.0)) - } +// if let forwardInfoNode = self.forwardInfoNode { +// let forwardInfoSize = forwardInfoNode.frame.size +// let forwardInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 12.0) : (params.width - params.rightInset - forwardInfoSize.width - layoutConstants.bubble.edgeInset - 12.0)), y: 8.0), size: forwardInfoSize) +// forwardInfoNode.frame = forwardInfoFrame +// } if let actionButtonsNode = self.actionButtonsNode { let actionButtonsSize = actionButtonsNode.frame.size diff --git a/submodules/TelegramUI/Sources/ChatMessageReplyInfoNode.swift b/submodules/TelegramUI/Sources/ChatMessageReplyInfoNode.swift index 94a6a72b8b..d3488b4957 100644 --- a/submodules/TelegramUI/Sources/ChatMessageReplyInfoNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageReplyInfoNode.swift @@ -247,9 +247,9 @@ class ChatMessageReplyInfoNode: ASDisplayNode { } node.imageNode?.captureProtected = message.isCopyProtected() - titleNode.frame = CGRect(origin: CGPoint(x: leftInset - textInsets.left, y: spacing - textInsets.top), size: titleLayout.size) + titleNode.frame = CGRect(origin: CGPoint(x: leftInset - textInsets.left - 2.0, y: spacing - textInsets.top + 1.0), size: titleLayout.size) - let textFrame = CGRect(origin: CGPoint(x: leftInset - textInsets.left, y: titleNode.frame.maxY - textInsets.bottom + spacing - textInsets.top), size: textLayout.size) + let textFrame = CGRect(origin: CGPoint(x: leftInset - textInsets.left - 2.0, y: titleNode.frame.maxY - textInsets.bottom + spacing - textInsets.top - 2.0), size: textLayout.size) textNode.frame = textFrame if !textLayout.spoilers.isEmpty { @@ -270,7 +270,7 @@ class ChatMessageReplyInfoNode: ASDisplayNode { } node.lineNode.image = lineImage - node.lineNode.frame = CGRect(origin: CGPoint(x: 1.0, y: 3.0), size: CGSize(width: 2.0, height: max(0.0, size.height - 5.0))) + node.lineNode.frame = CGRect(origin: CGPoint(x: 1.0, y: 3.0), size: CGSize(width: 2.0, height: max(0.0, size.height - 4.0))) node.contentNode.frame = CGRect(origin: CGPoint(), size: size) diff --git a/submodules/TelegramUI/Sources/ChatMessageStickerItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageStickerItemNode.swift index 7585b1dbe1..66cae8f595 100644 --- a/submodules/TelegramUI/Sources/ChatMessageStickerItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageStickerItemNode.swift @@ -36,13 +36,11 @@ class ChatMessageStickerItemNode: ChatMessageItemView { var telegramFile: TelegramMediaFile? private let fetchDisposable = MetaDisposable() - private var forwardInfoNode: ChatMessageForwardInfoNode? - private var forwardBackgroundNode: NavigationBackgroundNode? - private var viaBotNode: TextNode? private let dateAndStatusNode: ChatMessageDateAndStatusNode private var replyInfoNode: ChatMessageReplyInfoNode? private var replyBackgroundNode: NavigationBackgroundNode? + private var forwardInfoNode: ChatMessageForwardInfoNode? private var actionButtonsNode: ChatMessageActionButtonsNode? private var reactionButtonsNode: ChatMessageReactionButtonsNode? @@ -588,12 +586,6 @@ class ChatMessageStickerItemNode: ChatMessageItemView { } } - var needsReplyBackground = false - - if replyInfoApply != nil || viaBotApply != nil { - needsReplyBackground = true - } - var updatedShareButtonNode: ChatMessageShareButton? if needsShareButton { if let currentShareButtonNode = currentShareButtonNode { @@ -611,7 +603,6 @@ class ChatMessageStickerItemNode: ChatMessageItemView { var forwardPsaType: String? var forwardInfoSizeApply: (CGSize, (CGFloat) -> ChatMessageForwardInfoNode)? - var needsForwardBackground = false if !ignoreForward, let forwardInfo = item.message.forwardInfo { forwardPsaType = forwardInfo.psaType @@ -636,8 +627,11 @@ class ChatMessageStickerItemNode: ChatMessageItemView { } let availableForwardWidth = max(60.0, availableWidth + 6.0) forwardInfoSizeApply = makeForwardInfoLayout(item.presentationData, item.presentationData.strings, .standalone, forwardSource, forwardAuthorSignature, forwardPsaType, CGSize(width: availableForwardWidth, height: CGFloat.greatestFiniteMagnitude)) - - needsForwardBackground = true + } + + var needsReplyBackground = false + if replyInfoApply != nil || viaBotApply != nil || forwardInfoSizeApply != nil { + needsReplyBackground = true } var maxContentWidth = imageSize.width @@ -829,48 +823,89 @@ class ChatMessageStickerItemNode: ChatMessageItemView { strongSelf.replyBackgroundNode = nil } - if let (_, viaBotApply) = viaBotApply, let viaBotFrame = viaBotFrame { + var messageInfoSize = CGSize() + if let (viaBotLayout, _) = viaBotApply, forwardInfoSizeApply == nil { + messageInfoSize = CGSize(width: viaBotLayout.size.width + 1.0, height: 0.0) + } + if let (forwardInfoSize, _) = forwardInfoSizeApply { + messageInfoSize = CGSize(width: max(messageInfoSize.width, forwardInfoSize.width + 2.0), height: 0.0) + } + if let (replyInfoSize, _) = replyInfoApply { + messageInfoSize = CGSize(width: max(messageInfoSize.width, replyInfoSize.width), height: 0.0) + } + + if let (viaBotLayout, viaBotApply) = viaBotApply, forwardInfoSizeApply == nil { let viaBotNode = viaBotApply() if strongSelf.viaBotNode == nil { strongSelf.viaBotNode = viaBotNode strongSelf.contextSourceNode.contentNode.addSubnode(viaBotNode) } + let viaBotFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 11.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 9.0)), y: 8.0), size: viaBotLayout.size) viaBotNode.frame = viaBotFrame - if let replyBackgroundNode = strongSelf.replyBackgroundNode { - replyBackgroundNode.frame = CGRect(origin: CGPoint(x: viaBotFrame.minX - 6.0, y: viaBotFrame.minY - 2.0 - UIScreenPixel), size: CGSize(width: viaBotFrame.size.width + 11.0, height: viaBotFrame.size.height + 5.0)) - replyBackgroundNode.update(size: replyBackgroundNode.bounds.size, cornerRadius: 8.0, transition: .immediate) - } + + messageInfoSize = CGSize(width: messageInfoSize.width, height: viaBotLayout.size.height) } else if let viaBotNode = strongSelf.viaBotNode { viaBotNode.removeFromSupernode() strongSelf.viaBotNode = nil } + + if let (forwardInfoSize, forwardInfoApply) = forwardInfoSizeApply { + let forwardInfoNode = forwardInfoApply(forwardInfoSize.width) + if strongSelf.forwardInfoNode == nil { + strongSelf.forwardInfoNode = forwardInfoNode + strongSelf.contextSourceNode.contentNode.addSubnode(forwardInfoNode) + + if animation.isAnimated { + forwardInfoNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + } + } + let forwardInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 12.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 8.0)), y: 8.0 + messageInfoSize.height), size: forwardInfoSize) + forwardInfoNode.frame = forwardInfoFrame + + messageInfoSize = CGSize(width: messageInfoSize.width, height: messageInfoSize.height + forwardInfoSize.height - 1.0) + } else if let forwardInfoNode = strongSelf.forwardInfoNode { + if animation.isAnimated { + if let forwardInfoNode = strongSelf.forwardInfoNode { + strongSelf.forwardInfoNode = nil + forwardInfoNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak forwardInfoNode] _ in + forwardInfoNode?.removeFromSupernode() + }) + } + } else { + forwardInfoNode.removeFromSupernode() + strongSelf.forwardInfoNode = nil + } + } - if let (_, replyInfoApply) = replyInfoApply, let replyInfoFrame = replyInfoFrame { + if let (replyInfoSize, replyInfoApply) = replyInfoApply { let replyInfoNode = replyInfoApply() if strongSelf.replyInfoNode == nil { strongSelf.replyInfoNode = replyInfoNode strongSelf.contextSourceNode.contentNode.addSubnode(replyInfoNode) } + let replyInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 11.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 9.0)), y: 8.0 + messageInfoSize.height), size: replyInfoSize) replyInfoNode.frame = replyInfoFrame - if let replyBackgroundNode = strongSelf.replyBackgroundNode, let replyBackgroundFrame = replyBackgroundFrame { - replyBackgroundNode.frame = replyBackgroundFrame - replyBackgroundNode.update(size: replyBackgroundNode.bounds.size, cornerRadius: 8.0, transition: .immediate) - } - if isEmoji && !incoming { - if let _ = item.controllerInteraction.selectionState { - replyInfoNode.alpha = 0.0 - strongSelf.replyBackgroundNode?.alpha = 0.0 - } else { - replyInfoNode.alpha = 1.0 - strongSelf.replyBackgroundNode?.alpha = 1.0 - } - } + messageInfoSize = CGSize(width: max(messageInfoSize.width, replyInfoSize.width), height: messageInfoSize.height + replyInfoSize.height) } else if let replyInfoNode = strongSelf.replyInfoNode { replyInfoNode.removeFromSupernode() strongSelf.replyInfoNode = nil } + + if let replyBackgroundNode = strongSelf.replyBackgroundNode { + replyBackgroundNode.frame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 10.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 10.0)) - 4.0, y: 6.0), size: CGSize(width: messageInfoSize.width + 8.0, height: messageInfoSize.height + 5.0)) + + let cornerRadius = replyBackgroundNode.frame.height <= 22.0 ? replyBackgroundNode.frame.height / 2.0 : 8.0 + replyBackgroundNode.update(size: replyBackgroundNode.bounds.size, cornerRadius: cornerRadius, transition: .immediate) + } + + let panelsAlpha: CGFloat = item.controllerInteraction.selectionState == nil ? 1.0 : 0.0 + strongSelf.replyInfoNode?.alpha = panelsAlpha + strongSelf.viaBotNode?.alpha = panelsAlpha + strongSelf.forwardInfoNode?.alpha = panelsAlpha + strongSelf.replyBackgroundNode?.alpha = panelsAlpha + if isFailed { let deliveryFailedNode: ChatMessageDeliveryFailedNode var isAppearing = false @@ -901,61 +936,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView { deliveryFailedNode?.removeFromSupernode() }) } - - if needsForwardBackground { - if let forwardBackgroundNode = strongSelf.forwardBackgroundNode { - forwardBackgroundNode.updateColor(color: selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), enableBlur: dateFillNeedsBlur(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), transition: .immediate) - } else { - let forwardBackgroundNode = NavigationBackgroundNode(color: selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), enableBlur: dateFillNeedsBlur(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper)) - strongSelf.forwardBackgroundNode = forwardBackgroundNode - strongSelf.contextSourceNode.contentNode.addSubnode(forwardBackgroundNode) - - if animation.isAnimated { - forwardBackgroundNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) - } - } - } else if let forwardBackgroundNode = strongSelf.forwardBackgroundNode { - if animation.isAnimated { - strongSelf.forwardBackgroundNode = nil - forwardBackgroundNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak forwardBackgroundNode] _ in - forwardBackgroundNode?.removeFromSupernode() - }) - } else { - forwardBackgroundNode.removeFromSupernode() - strongSelf.forwardBackgroundNode = nil - } - } - - if let (forwardInfoSize, forwardInfoApply) = forwardInfoSizeApply { - let forwardInfoNode = forwardInfoApply(forwardInfoSize.width) - if strongSelf.forwardInfoNode == nil { - strongSelf.forwardInfoNode = forwardInfoNode - strongSelf.contextSourceNode.contentNode.addSubnode(forwardInfoNode) - - if animation.isAnimated { - forwardInfoNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) - } - } - let forwardInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 12.0) : (params.width - params.rightInset - forwardInfoSize.width - layoutConstants.bubble.edgeInset - 12.0)), y: 8.0), size: forwardInfoSize) - forwardInfoNode.frame = forwardInfoFrame - if let forwardBackgroundNode = strongSelf.forwardBackgroundNode { - forwardBackgroundNode.frame = CGRect(origin: CGPoint(x: forwardInfoFrame.minX - 6.0, y: forwardInfoFrame.minY - 2.0), size: CGSize(width: forwardInfoFrame.size.width + 10.0, height: forwardInfoFrame.size.height + 4.0)) - forwardBackgroundNode.update(size: forwardBackgroundNode.bounds.size, cornerRadius: 8.0, transition: .immediate) - } - } else if let forwardInfoNode = strongSelf.forwardInfoNode { - if animation.isAnimated { - if let forwardInfoNode = strongSelf.forwardInfoNode { - strongSelf.forwardInfoNode = nil - forwardInfoNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak forwardInfoNode] _ in - forwardInfoNode?.removeFromSupernode() - }) - } - } else { - forwardInfoNode.removeFromSupernode() - strongSelf.forwardInfoNode = nil - } - } - + if let actionButtonsSizeAndApply = actionButtonsSizeAndApply { let actionButtonsNode = actionButtonsSizeAndApply.1(animation) let previousFrame = actionButtonsNode.frame @@ -1333,12 +1314,18 @@ class ChatMessageStickerItemNode: ChatMessageItemView { } let transition: ContainedViewLayoutTransition = animated ? .animated(duration: 0.2, curve: .easeInOut) : .immediate - let replyAlpha: CGFloat = item.controllerInteraction.selectionState == nil ? 1.0 : 0.0 + let panelsAlpha: CGFloat = item.controllerInteraction.selectionState == nil ? 1.0 : 0.0 if let replyInfoNode = self.replyInfoNode { - transition.updateAlpha(node: replyInfoNode, alpha: replyAlpha) + transition.updateAlpha(node: replyInfoNode, alpha: panelsAlpha) + } + if let viaBotNode = self.viaBotNode { + transition.updateAlpha(node: viaBotNode, alpha: panelsAlpha) + } + if let forwardInfoNode = self.forwardInfoNode { + transition.updateAlpha(node: forwardInfoNode, alpha: panelsAlpha) } if let replyBackgroundNode = self.replyBackgroundNode { - transition.updateAlpha(node: replyBackgroundNode, alpha: replyAlpha) + transition.updateAlpha(node: replyBackgroundNode, alpha: panelsAlpha) } if let selectionState = item.controllerInteraction.selectionState {