diff --git a/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift b/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift index f5cbdd82d1..10989ef99f 100644 --- a/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift +++ b/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift @@ -756,7 +756,16 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo func deleteMessages(messageIds: Set?) { if let messageIds = messageIds ?? self.stateValue.selectedMessageIds, !messageIds.isEmpty { - self.activeActionDisposable.set((self.context.sharedContext.chatAvailableMessageActions(postbox: self.context.account.postbox, accountPeerId: self.context.account.peerId, messageIds: messageIds) + let (peers, messages) = self.currentMessages + let _ = (self.context.account.postbox.transaction { transaction -> Void in + for id in messageIds { + if transaction.getMessage(id) == nil, let message = messages[id] { + storeMessageFromSearch(transaction: transaction, message: message) + } + } + }).start() + + self.activeActionDisposable.set((self.context.sharedContext.chatAvailableMessageActions(postbox: self.context.account.postbox, accountPeerId: self.context.account.peerId, messageIds: messageIds, messages: messages, peers: peers) |> deliverOnMainQueue).start(next: { [weak self] actions in if let strongSelf = self, !actions.options.isEmpty { let actionSheet = ActionSheetController(presentationData: strongSelf.presentationData) @@ -818,6 +827,15 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo func forwardMessages(messageIds: Set?) { let messageIds = messageIds ?? self.stateValue.selectedMessageIds if let messageIds = messageIds, !messageIds.isEmpty { + let messages = self.paneContainerNode.allCurrentMessages() + let _ = (self.context.account.postbox.transaction { transaction -> Void in + for id in messageIds { + if transaction.getMessage(id) == nil, let message = messages[id] { + storeMessageFromSearch(transaction: transaction, message: message) + } + } + }).start() + let peerSelectionController = self.context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: self.context, filter: [.onlyWriteable, .excludeDisabled])) peerSelectionController.peerSelected = { [weak self, weak peerSelectionController] peerId in if let strongSelf = self, let _ = peerSelectionController { @@ -832,22 +850,22 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo return nil } return strongSelf.context.account.pendingMessageManager.pendingMessageStatus(id) - |> mapToSignal { status, _ -> Signal in - if status != nil { - return .never() - } else { - return .single(true) - } + |> mapToSignal { status, _ -> Signal in + if status != nil { + return .never() + } else { + return .single(true) } - |> take(1) + } + |> take(1) }) strongSelf.activeActionDisposable.set((combineLatest(signals) - |> deliverOnMainQueue).start(completed: { - guard let strongSelf = self else { - return - } - strongSelf.present?(OverlayStatusController(theme: strongSelf.presentationData.theme, type: .success), nil) - })) + |> deliverOnMainQueue).start(completed: { + guard let strongSelf = self else { + return + } + strongSelf.present?(OverlayStatusController(theme: strongSelf.presentationData.theme, type: .success), nil) + })) } }) if let peerSelectionController = peerSelectionController { diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index 2bcbaf17c3..fe520ba9b6 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -3654,7 +3654,44 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G transformedMessages = strongSelf.transformEnqueueMessages(messages) } - let _ = (enqueueMessages(account: strongSelf.context.account, peerId: peerId, messages: transformedMessages) + var forwardedMessages: [[EnqueueMessage]] = [] + var forwardSourcePeerIds = Set() + for message in transformedMessages { + if case let .forward(source, _, _) = message { + forwardSourcePeerIds.insert(source.peerId) + + var added = false + if var last = forwardedMessages.last { + if let currentMessage = last.first, case let .forward(currentSource, _, _) = currentMessage, currentSource.peerId == source.peerId { + last.append(message) + added = true + } + } + if !added { + forwardedMessages.append([message]) + } + } + } + + let signal: Signal<[MessageId?], NoError> + if forwardSourcePeerIds.count > 1 { + var signals: [Signal<[MessageId?], NoError>] = [] + for messagesGroup in forwardedMessages { + signals.append(enqueueMessages(account: strongSelf.context.account, peerId: peerId, messages: messagesGroup)) + } + signal = combineLatest(signals) + |> map { results in + var ids: [MessageId?] = [] + for result in results { + ids.append(contentsOf: result) + } + return ids + } + } else { + signal = enqueueMessages(account: strongSelf.context.account, peerId: peerId, messages: transformedMessages) + } + + let _ = (signal |> deliverOnMainQueue).start(next: { messageIds in if let strongSelf = self { if strongSelf.presentationInterfaceState.isScheduledMessages {