From 825dba003bd75cfbce679c62ed68de1f6d465ba5 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Thu, 26 Oct 2023 00:41:46 +0400 Subject: [PATCH 1/5] Fix story preview --- .../ChatMessageAttachedContentNode.swift | 13 ++++++- .../ChatMessageWebpageBubbleContentNode.swift | 2 +- .../Sources/ChatControllerNode.swift | 38 ++++++++++++++----- 3 files changed, 40 insertions(+), 13 deletions(-) diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentNode/Sources/ChatMessageAttachedContentNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentNode/Sources/ChatMessageAttachedContentNode.swift index 6ea8b4fa38..a57e1fc1a1 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentNode/Sources/ChatMessageAttachedContentNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentNode/Sources/ChatMessageAttachedContentNode.swift @@ -249,6 +249,13 @@ public final class ChatMessageAttachedContentNode: ASDisplayNode { var contentMediaAutomaticPlayback: Bool = false var contentMediaAutomaticDownload: InteractiveMediaNodeAutodownloadMode = .none + var mediaAndFlags = mediaAndFlags + if let mediaAndFlagsValue = mediaAndFlags, let _ = mediaAndFlagsValue.0 as? TelegramMediaStory { + var flags = mediaAndFlagsValue.1 + flags.remove(.preferMediaInline) + mediaAndFlags = (mediaAndFlagsValue.0, flags) + } + var contentMediaAspectFilled = false if let (_, flags) = mediaAndFlags { contentMediaAspectFilled = flags.contains(.preferMediaAspectFilled) @@ -921,10 +928,12 @@ public final class ChatMessageAttachedContentNode: ASDisplayNode { } if updateMedia { - if let image = inlineMediaValue as? TelegramMediaImage { + let resolvedInlineMediaValue = inlineMediaValue + + if let image = resolvedInlineMediaValue as? TelegramMediaImage { let updateInlineImageSignal = chatWebpageSnippetPhoto(account: context.account, userLocation: .peer(message.id.peerId), photoReference: .message(message: MessageReference(message), media: image), placeholderColor: mainColor.withMultipliedAlpha(0.1)) inlineMedia.setSignal(updateInlineImageSignal) - } else if let file = inlineMediaValue as? TelegramMediaFile, let representation = file.previewRepresentations.last { + } else if let file = resolvedInlineMediaValue as? TelegramMediaFile, let representation = file.previewRepresentations.last { let updateInlineImageSignal = chatWebpageSnippetFile(account: context.account, userLocation: .peer(message.id.peerId), mediaReference: .message(message: MessageReference(message), media: file), representation: representation) inlineMedia.setSignal(updateInlineImageSignal) } diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageWebpageBubbleContentNode/Sources/ChatMessageWebpageBubbleContentNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageWebpageBubbleContentNode/Sources/ChatMessageWebpageBubbleContentNode.swift index b90e86da91..3434154826 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageWebpageBubbleContentNode/Sources/ChatMessageWebpageBubbleContentNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageWebpageBubbleContentNode/Sources/ChatMessageWebpageBubbleContentNode.swift @@ -54,7 +54,7 @@ public final class ChatMessageWebpageBubbleContentNode: ChatMessageBubbleContent item.controllerInteraction.openTheme(item.message) return } else { - if content.embedUrl == nil && (content.title != nil || content.text != nil) { + if content.embedUrl == nil && (content.title != nil || content.text != nil) && content.story == nil { var shouldOpenUrl = true if let file = content.file { if !file.isVideo, !file.isVideoSticker, !file.isAnimated, !file.isAnimatedSticker, !file.isSticker, !file.isMusic { diff --git a/submodules/TelegramUI/Sources/ChatControllerNode.swift b/submodules/TelegramUI/Sources/ChatControllerNode.swift index 123fe48534..dff4f1438f 100644 --- a/submodules/TelegramUI/Sources/ChatControllerNode.swift +++ b/submodules/TelegramUI/Sources/ChatControllerNode.swift @@ -507,23 +507,40 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { source = .custom(messages: messages, messageId: messageIds.first ?? MessageId(peerId: PeerId(0), namespace: 0, id: 0), quote: reply.quote?.text, loadMore: nil) case let .link(link): let messages = link.options - |> mapToSignal { options -> Signal<(ChatControllerSubject.LinkOptions, Peer, Message?), NoError> in + |> mapToSignal { options -> Signal<(ChatControllerSubject.LinkOptions, Peer, Message?, [StoryId: CodableEntry]), NoError> in + let stories: Signal<[StoryId: CodableEntry], NoError> + if case let .Loaded(content) = options.webpage.content, let story = content.story { + stories = context.account.postbox.transaction { transaction -> [StoryId: CodableEntry] in + var result: [StoryId: CodableEntry] = [:] + if let storyValue = transaction.getStory(id: story.storyId) { + result[story.storyId] = storyValue + } + return result + } + } else { + stories = .single([:]) + } + if let replyMessageId = options.replyMessageId { return combineLatest( context.account.postbox.messagesAtIds([replyMessageId]), - context.account.postbox.loadedPeerWithId(context.account.peerId) + context.account.postbox.loadedPeerWithId(context.account.peerId), + stories ) - |> map { messages, peer -> (ChatControllerSubject.LinkOptions, Peer, Message?) in - return (options, peer, messages.first) + |> map { messages, peer, stories -> (ChatControllerSubject.LinkOptions, Peer, Message?, [StoryId: CodableEntry]) in + return (options, peer, messages.first, stories) } } else { - return context.account.postbox.loadedPeerWithId(context.account.peerId) - |> map { peer -> (ChatControllerSubject.LinkOptions, Peer, Message?) in - return (options, peer, nil) + return combineLatest( + context.account.postbox.loadedPeerWithId(context.account.peerId), + stories + ) + |> map { peer, stories -> (ChatControllerSubject.LinkOptions, Peer, Message?, [StoryId: CodableEntry]) in + return (options, peer, nil, stories) } } } - |> map { options, accountPeer, replyMessage -> ([Message], Int32, Bool) in + |> map { options, accountPeer, replyMessage, stories -> ([Message], Int32, Bool) in var peers = SimpleDictionary() peers[accountPeer.id] = accountPeer @@ -534,10 +551,11 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { media.append(TelegramMediaWebpage(webpageId: options.webpage.webpageId, content: .Loaded(content))) } + let associatedStories: [StoryId: CodableEntry] = stories + var attributes: [MessageAttribute] = [] attributes.append(TextEntitiesMessageAttribute(entities: options.messageEntities)) - attributes.append(WebpagePreviewMessageAttribute(leadingPreview: !options.linkBelowText, forceLargeMedia: options.largeMedia, isManuallyAdded: true, isSafe: false)) if let replyMessage { @@ -574,7 +592,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { associatedMessageIds: [], associatedMedia: [:], associatedThreadInfo: nil, - associatedStories: [:] + associatedStories: associatedStories ) return ([message], 1, false) From 16245afca1d32a654d7976cec27e14f336eafaa9 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Thu, 26 Oct 2023 00:54:17 +0400 Subject: [PATCH 2/5] Fix reply image offset --- .../Sources/ChatMessageReplyInfoNode.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageReplyInfoNode/Sources/ChatMessageReplyInfoNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageReplyInfoNode/Sources/ChatMessageReplyInfoNode.swift index cf692603df..01b21089e9 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageReplyInfoNode/Sources/ChatMessageReplyInfoNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageReplyInfoNode/Sources/ChatMessageReplyInfoNode.swift @@ -670,7 +670,7 @@ public class ChatMessageReplyInfoNode: ASDisplayNode { node.addSubnode(imageNode) node.imageNode = imageNode } - imageNode.frame = CGRect(origin: CGPoint(x: 9.0, y: 3.0 + UIScreenPixel), size: CGSize(width: imageSide, height: imageSide)) + imageNode.frame = CGRect(origin: CGPoint(x: 9.0, y: 4.0), size: CGSize(width: imageSide, height: imageSide)) if let updateImageSignal = updateImageSignal { imageNode.setSignal(updateImageSignal) From ff742484277244cb65835a0f7b0d21ed7019cf76 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Thu, 26 Oct 2023 00:54:24 +0400 Subject: [PATCH 3/5] Fix build --- submodules/TelegramUI/Sources/OpenResolvedUrl.swift | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/submodules/TelegramUI/Sources/OpenResolvedUrl.swift b/submodules/TelegramUI/Sources/OpenResolvedUrl.swift index a1afcdf02a..5c9c0df71b 100644 --- a/submodules/TelegramUI/Sources/OpenResolvedUrl.swift +++ b/submodules/TelegramUI/Sources/OpenResolvedUrl.swift @@ -905,11 +905,9 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur let controller = PremiumIntroScreen(context: context, source: .settings, forceDark: forceDark, forceHasPremium: true) navigationController?.pushViewController(controller) - if let controller = controller as? PremiumIntroScreen { - Queue.mainQueue().after(0.3, { - controller.animateSuccess() - }) - } + Queue.mainQueue().after(0.3, { + controller.animateSuccess() + }) }) }, openPeer: { peer in From 595755581309ba28ef2ede65e3bf5ee56cab18b4 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Thu, 26 Oct 2023 01:16:50 +0400 Subject: [PATCH 4/5] Maybe fix thread ids --- .../Sources/ApiUtils/StoreMessage_Telegram.swift | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/submodules/TelegramCore/Sources/ApiUtils/StoreMessage_Telegram.swift b/submodules/TelegramCore/Sources/ApiUtils/StoreMessage_Telegram.swift index aa8b7fb981..9603c2d28d 100644 --- a/submodules/TelegramCore/Sources/ApiUtils/StoreMessage_Telegram.swift +++ b/submodules/TelegramCore/Sources/ApiUtils/StoreMessage_Telegram.swift @@ -599,21 +599,19 @@ extension StoreMessage { if let replyToTopId = replyToTopId { if peerIsForum { if isForumTopic { - let threadIdValue = MessageId(peerId: replyPeerId, namespace: Namespaces.Message.Cloud, id: replyToTopId) + let threadIdValue = MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: replyToTopId) threadMessageId = threadIdValue if replyPeerId == peerId { threadId = makeMessageThreadId(threadIdValue) } } } else { - let threadIdValue = MessageId(peerId: replyPeerId, namespace: Namespaces.Message.Cloud, id: replyToTopId) + let threadIdValue = MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: replyToTopId) threadMessageId = threadIdValue - if replyPeerId == peerId { - threadId = makeMessageThreadId(threadIdValue) - } + threadId = makeMessageThreadId(threadIdValue) } } else if peerId.namespace == Namespaces.Peer.CloudChannel { - let threadIdValue = MessageId(peerId: replyPeerId, namespace: Namespaces.Message.Cloud, id: replyToMsgId) + let threadIdValue = MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: replyToMsgId) if peerIsForum { if isForumTopic { From c0da8fb4048a969e9a1c86c4118ecbd705a5e140 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Thu, 26 Oct 2023 01:41:01 +0400 Subject: [PATCH 5/5] Visual improvements --- .../Source/ContextMenuContainerNode.swift | 2 +- .../Sources/ChatTextInputPanelNode.swift | 42 +++++++++++++++++-- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/submodules/Display/Source/ContextMenuContainerNode.swift b/submodules/Display/Source/ContextMenuContainerNode.swift index 3eab3808b4..445654a944 100644 --- a/submodules/Display/Source/ContextMenuContainerNode.swift +++ b/submodules/Display/Source/ContextMenuContainerNode.swift @@ -33,7 +33,7 @@ public final class ContextMenuContainerNode: ASDisplayNode { self.containerNode.view.addSubview(effectView) self.effectView = effectView } else { - self.containerNode.backgroundColor = isDark ? UIColor(rgb: 0x8c8e8e) : UIColor(rgb: 0xF8F8F6) + self.containerNode.backgroundColor = isDark ? UIColor(rgb: 0x2f2f2f) : UIColor(rgb: 0xF8F8F6) } self.layer.shadowColor = UIColor.black.cgColor diff --git a/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift b/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift index 3d0ce0ccfd..1e2d2e40ee 100644 --- a/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift +++ b/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift @@ -1046,7 +1046,30 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate, Ch var keyboardAppearance: UIKeyboardAppearance = UIKeyboardAppearance.default if let presentationInterfaceState = self.presentationInterfaceState { var lineStyle: ChatInputTextView.Theme.Quote.LineStyle = .solid - if let accountPeerColor = presentationInterfaceState.accountPeerColor { + let authorNameColor: UIColor + let dashSecondaryColor: UIColor? + let dashTertiaryColor: UIColor? + + if let context = self.context, let peer = presentationInterfaceState.renderedPeer?.peer as? TelegramChannel, case .broadcast = peer.info, let nameColor = peer.nameColor { + let _ = nameColor + + lineStyle = .solid + authorNameColor = presentationInterfaceState.theme.list.itemAccentColor + dashSecondaryColor = nil + dashTertiaryColor = nil + + /*let colors = context.peerNameColors.get(nameColor) + + authorNameColor = colors.main + dashSecondaryColor = colors.secondary + dashTertiaryColor = colors.tertiary + + if dashSecondaryColor != nil { + lineStyle = .doubleDashed + } else { + lineStyle = .solid + }*/ + } else if let accountPeerColor = presentationInterfaceState.accountPeerColor { switch accountPeerColor.style { case .solid: lineStyle = .solid @@ -1055,11 +1078,24 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate, Ch case .tripleDashed: lineStyle = .tripleDashed } + + authorNameColor = presentationInterfaceState.theme.list.itemAccentColor + dashSecondaryColor = .clear + dashTertiaryColor = nil + } else { + lineStyle = .solid + authorNameColor = presentationInterfaceState.theme.list.itemAccentColor + dashSecondaryColor = nil + dashTertiaryColor = nil } + + let _ = dashSecondaryColor + let _ = dashTertiaryColor + textInputNode.textView.theme = ChatInputTextView.Theme( quote: ChatInputTextView.Theme.Quote( - background: presentationInterfaceState.theme.list.itemAccentColor.withMultipliedAlpha(presentationInterfaceState.theme.overallDarkAppearance ? 0.2 : 0.1), - foreground: presentationInterfaceState.theme.list.itemAccentColor, + background: authorNameColor.withMultipliedAlpha(presentationInterfaceState.theme.overallDarkAppearance ? 0.2 : 0.1), + foreground: authorNameColor, lineStyle: lineStyle ) )