From 3872d2129892d48cd8f597355bc1332022068a86 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Fri, 13 Oct 2023 15:58:10 +0400 Subject: [PATCH] [WIP] Quotes --- .../Sources/Account/AccountManager.swift | 1 + .../ApiUtils/TelegramMediaWebpage.swift | 18 +++++ .../Chat/ChatMessageActionOptions.swift | 72 +++++++------------ .../Sources/ChatControllerNode.swift | 2 +- 4 files changed, 45 insertions(+), 48 deletions(-) diff --git a/submodules/TelegramCore/Sources/Account/AccountManager.swift b/submodules/TelegramCore/Sources/Account/AccountManager.swift index 72122f3c07..2d474719ce 100644 --- a/submodules/TelegramCore/Sources/Account/AccountManager.swift +++ b/submodules/TelegramCore/Sources/Account/AccountManager.swift @@ -202,6 +202,7 @@ private var declaredEncodables: Void = { declareEncodable(SynchronizePeerStoriesOperation.self, f: { SynchronizePeerStoriesOperation(decoder: $0) }) declareEncodable(MapVenue.self, f: { MapVenue(decoder: $0) }) declareEncodable(TelegramMediaGiveaway.self, f: { TelegramMediaGiveaway(decoder: $0) }) + declareEncodable(WebpagePreviewMessageAttribute.self, f: { WebpagePreviewMessageAttribute(decoder: $0) }) return }() diff --git a/submodules/TelegramCore/Sources/ApiUtils/TelegramMediaWebpage.swift b/submodules/TelegramCore/Sources/ApiUtils/TelegramMediaWebpage.swift index 99ed33e73d..b1ab2bb122 100644 --- a/submodules/TelegramCore/Sources/ApiUtils/TelegramMediaWebpage.swift +++ b/submodules/TelegramCore/Sources/ApiUtils/TelegramMediaWebpage.swift @@ -60,3 +60,21 @@ func telegramMediaWebpageFromApiWebpage(_ webpage: Api.WebPage, url: String?) -> return nil } } + +public class WebpagePreviewMessageAttribute: MessageAttribute, Equatable { + public let associatedPeerIds: [PeerId] = [] + public let associatedMediaIds: [MediaId] = [] + + public init() { + } + + required public init(decoder: PostboxDecoder) { + } + + public func encode(_ encoder: PostboxEncoder) { + } + + public static func ==(lhs: WebpagePreviewMessageAttribute, rhs: WebpagePreviewMessageAttribute) -> Bool { + return true + } +} diff --git a/submodules/TelegramUI/Sources/Chat/ChatMessageActionOptions.swift b/submodules/TelegramUI/Sources/Chat/ChatMessageActionOptions.swift index b9a1f79a78..b3a2aa091d 100644 --- a/submodules/TelegramUI/Sources/Chat/ChatMessageActionOptions.swift +++ b/submodules/TelegramUI/Sources/Chat/ChatMessageActionOptions.swift @@ -27,9 +27,11 @@ private func presentChatInputOptions(selfController: ChatControllerImpl, sourceN let replySelectionState = Promise(ChatControllerSubject.MessageOptionsInfo.SelectionState(quote: nil)) - if let source = chatForwardOptions(selfController: selfController, sourceNode: sourceNode, getContextController: { + var forwardDismissedForCancel: (() -> Void)? + if let (source, dismissedForCancel) = chatForwardOptions(selfController: selfController, sourceNode: sourceNode, getContextController: { return getContextController?() }) { + forwardDismissedForCancel = dismissedForCancel sources.append(source) } if let source = chatReplyOptions(selfController: selfController, sourceNode: sourceNode, getContextController: { @@ -67,13 +69,20 @@ private func presentChatInputOptions(selfController: ChatControllerImpl, sourceN return contextController } + contextController.dismissedForCancel = { + forwardDismissedForCancel?() + } + selfController.presentInGlobalOverlay(contextController) } -private func chatForwardOptions(selfController: ChatControllerImpl, sourceNode: ASDisplayNode, getContextController: @escaping () -> ContextController?) -> ContextController.Source? { +private func chatForwardOptions(selfController: ChatControllerImpl, sourceNode: ASDisplayNode, getContextController: @escaping () -> ContextController?) -> (ContextController.Source, () -> Void)? { guard let peerId = selfController.chatLocation.peerId else { return nil } + guard let initialForwardMessageIds = selfController.presentationInterfaceState.interfaceState.forwardMessageIds, !initialForwardMessageIds.isEmpty else { + return nil + } let presentationData = selfController.presentationData let forwardOptions = selfController.presentationInterfaceStatePromise.get() @@ -258,49 +267,7 @@ private func chatForwardOptions(selfController: ChatControllerImpl, sourceNode: return items } - //TODO:localize - return ContextController.Source( - id: AnyHashable(OptionsId.forward), - title: "Forward", - source: .controller(ChatContextControllerContentSourceImpl(controller: chatController, sourceNode: sourceNode, passthroughTouches: true)), - items: items |> map { ContextController.Items(content: .list($0)) } - ) -} - -func presentChatForwardOptions(selfController: ChatControllerImpl, sourceNode: ASDisplayNode) { - if "".isEmpty { - presentChatInputOptions(selfController: selfController, sourceNode: sourceNode, initialId: .forward) - return - } - - var getContextController: (() -> ContextController?)? - - guard let source = chatForwardOptions(selfController: selfController, sourceNode: sourceNode, getContextController: { - return getContextController?() - }) else { - return - } - selfController.chatDisplayNode.messageTransitionNode.dismissMessageReactionContexts() - - selfController.canReadHistory.set(false) - - let contextController = ContextController( - presentationData: selfController.presentationData, - configuration: ContextController.Configuration( - sources: [source], - initialId: source.id - ) - ) - contextController.dismissed = { [weak selfController] in - selfController?.canReadHistory.set(true) - } - - getContextController = { [weak contextController] in - return contextController - } - - //TODO:loc - /*contextController.dismissedForCancel = { [weak selfController, weak chatController] in + let dismissedForCancel: () -> Void = { [weak selfController, weak chatController] in guard let selfController else { return } @@ -309,8 +276,19 @@ func presentChatForwardOptions(selfController: ChatControllerImpl, sourceNode: A forwardMessageIds = forwardMessageIds.filter { selectedMessageIds.contains($0) } selfController.updateChatPresentationInterfaceState(interactive: false, { $0.updatedInterfaceState({ $0.withUpdatedForwardMessageIds(forwardMessageIds) }) }) } - }*/ - selfController.presentInGlobalOverlay(contextController) + } + + //TODO:localize + return (ContextController.Source( + id: AnyHashable(OptionsId.forward), + title: "Forward", + source: .controller(ChatContextControllerContentSourceImpl(controller: chatController, sourceNode: sourceNode, passthroughTouches: true)), + items: items |> map { ContextController.Items(content: .list($0)) } + ), dismissedForCancel) +} + +func presentChatForwardOptions(selfController: ChatControllerImpl, sourceNode: ASDisplayNode) { + presentChatInputOptions(selfController: selfController, sourceNode: sourceNode, initialId: .forward) } private func generateChatReplyOptionItems(selfController: ChatControllerImpl, chatController: ChatControllerImpl) -> Signal { diff --git a/submodules/TelegramUI/Sources/ChatControllerNode.swift b/submodules/TelegramUI/Sources/ChatControllerNode.swift index 759b8ee2b0..46b555fe4b 100644 --- a/submodules/TelegramUI/Sources/ChatControllerNode.swift +++ b/submodules/TelegramUI/Sources/ChatControllerNode.swift @@ -402,7 +402,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { var messages = messages let forwardedMessageIds = Set(messages.map { $0.id }) messages.sort(by: { lhsMessage, rhsMessage in - return lhsMessage.timestamp > rhsMessage.timestamp + return lhsMessage.index > rhsMessage.index }) messages = messages.map { message in var flags = message.flags