diff --git a/submodules/TelegramCore/Sources/ApplyUpdateMessage.swift b/submodules/TelegramCore/Sources/ApplyUpdateMessage.swift index 6a7597a014..4f5e76a9eb 100644 --- a/submodules/TelegramCore/Sources/ApplyUpdateMessage.swift +++ b/submodules/TelegramCore/Sources/ApplyUpdateMessage.swift @@ -215,7 +215,7 @@ func applyUpdateGroupMessages(postbox: Postbox, stateManager: AccountStateManage let updatedRawMessageIds = result.updatedRawMessageIds var namespace = Namespaces.Message.Cloud - if let message = messages.first, Namespaces.Message.allScheduled.contains(message.id.namespace) { + if let message = messages.first, let apiMessage = result.messages.first, message.scheduleTime != nil && message.scheduleTime == apiMessage.timestamp { namespace = Namespaces.Message.ScheduledCloud } @@ -225,7 +225,7 @@ func applyUpdateGroupMessages(postbox: Postbox, stateManager: AccountStateManage resultMessages[id] = resultMessage } } - + var mapping: [(Message, MessageIndex, StoreMessage)] = [] for message in messages { diff --git a/submodules/TelegramCore/Sources/PendingMessageManager.swift b/submodules/TelegramCore/Sources/PendingMessageManager.swift index 0be097728d..3a4a3054b7 100644 --- a/submodules/TelegramCore/Sources/PendingMessageManager.swift +++ b/submodules/TelegramCore/Sources/PendingMessageManager.swift @@ -75,7 +75,7 @@ private func reasonForError(_ error: String) -> PendingMessageFailureReason? { } private final class PeerPendingMessagesSummaryContext { - var messageDeliveredSubscribers = Bag<() -> Void>() + var messageDeliveredSubscribers = Bag<(MessageId.Namespace) -> Void>() var messageFailedSubscribers = Bag<(PendingMessageFailureReason) -> Void>() } @@ -239,7 +239,7 @@ public final class PendingMessageManager { for peerId in peerIdsWithDeliveredMessages { if let context = strongSelf.peerSummaryContexts[peerId] { for subscriber in context.messageDeliveredSubscribers.copyItems() { - subscriber() + subscriber(Namespaces.Message.Cloud) } } } @@ -1044,13 +1044,28 @@ public final class PendingMessageManager { } private func applySentMessage(postbox: Postbox, stateManager: AccountStateManager, message: Message, result: Api.Updates) -> Signal { + var apiMessage: Api.Message? + for resultMessage in result.messages { + if let id = resultMessage.id(namespace: Namespaces.Message.allScheduled.contains(message.id.namespace) ? Namespaces.Message.ScheduledCloud : Namespaces.Message.Cloud) { + if id.peerId == message.id.peerId { + apiMessage = resultMessage + break + } + } + } + + var namespace = Namespaces.Message.Cloud + if let apiMessage = apiMessage, let id = apiMessage.id(namespace: message.scheduleTime != nil && message.scheduleTime == apiMessage.timestamp ? Namespaces.Message.ScheduledCloud : Namespaces.Message.Cloud) { + namespace = id.namespace + } + return applyUpdateMessage(postbox: postbox, stateManager: stateManager, message: message, result: result) |> afterDisposed { [weak self] in if let strongSelf = self { strongSelf.queue.async { if let context = strongSelf.peerSummaryContexts[message.id.peerId] { for subscriber in context.messageDeliveredSubscribers.copyItems() { - subscriber() + subscriber(namespace) } } } @@ -1059,13 +1074,18 @@ public final class PendingMessageManager { } private func applySentGroupMessages(postbox: Postbox, stateManager: AccountStateManager, messages: [Message], result: Api.Updates) -> Signal { + var namespace = Namespaces.Message.Cloud + if let message = messages.first, let apiMessage = result.messages.first, message.scheduleTime != nil && message.scheduleTime == apiMessage.timestamp { + namespace = Namespaces.Message.ScheduledCloud + } + return applyUpdateGroupMessages(postbox: postbox, stateManager: stateManager, messages: messages, result: result) |> afterDisposed { [weak self] in if let strongSelf = self { strongSelf.queue.async { - if let peerId = messages.first?.id.peerId, let context = strongSelf.peerSummaryContexts[peerId] { + if let message = messages.first, let context = strongSelf.peerSummaryContexts[message.id.peerId] { for subscriber in context.messageDeliveredSubscribers.copyItems() { - subscriber() + subscriber(namespace) } } } @@ -1073,7 +1093,7 @@ public final class PendingMessageManager { } } - public func deliveredMessageEvents(peerId: PeerId) -> Signal { + public func deliveredMessageEvents(peerId: PeerId) -> Signal { return Signal { subscriber in let disposable = MetaDisposable() @@ -1086,8 +1106,8 @@ public final class PendingMessageManager { self.peerSummaryContexts[peerId] = summaryContext } - let index = summaryContext.messageDeliveredSubscribers.add({ - subscriber.putNext(true) + let index = summaryContext.messageDeliveredSubscribers.add({ namespace in + subscriber.putNext(namespace) }) disposable.set(ActionDisposable { diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index 1b62b5f3f3..3ad360f14a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -1615,7 +1615,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G strongSelf.presentScheduleTimePicker(completion: { [weak self] time in if let strongSelf = self { strongSelf.chatDisplayNode.sendCurrentMessage(scheduleTime: time, completion: { [weak self] in - if let strongSelf = self, !strongSelf.presentationInterfaceState.isScheduledMessages { + if let strongSelf = self, !strongSelf.presentationInterfaceState.isScheduledMessages && time != scheduleWhenOnlineTimestamp { strongSelf.openScheduledMessages() } }) @@ -4243,13 +4243,16 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G }) } - self.sentMessageEventsDisposable.set(self.context.account.pendingMessageManager.deliveredMessageEvents(peerId: peerId).start(next: { [weak self] _ in + self.sentMessageEventsDisposable.set((self.context.account.pendingMessageManager.deliveredMessageEvents(peerId: peerId) + |> deliverOnMainQueue).start(next: { [weak self] namespace in if let strongSelf = self { - let inAppNotificationSettings: InAppNotificationSettings = strongSelf.context.sharedContext.currentInAppNotificationSettings.with { $0 } - + let inAppNotificationSettings = strongSelf.context.sharedContext.currentInAppNotificationSettings.with { $0 } if inAppNotificationSettings.playSounds { serviceSoundManager.playMessageDeliveredSound() } + if !strongSelf.presentationInterfaceState.isScheduledMessages && namespace == Namespaces.Message.ScheduledCloud { + strongSelf.openScheduledMessages() + } } })) @@ -4526,11 +4529,6 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } } } - - /*if let subject = self.subject, case .scheduledMessages = subject { - self.chatDisplayNode.animateIn() - self.updateTransitionWhenPresentedAsModal?(1.0, .animated(duration: 0.5, curve: .spring)) - }*/ } override public func viewWillDisappear(_ animated: Bool) { @@ -5514,7 +5512,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G strongSelf.presentScheduleTimePicker(completion: { [weak self] time in if let strongSelf = self { done(time) - if !strongSelf.presentationInterfaceState.isScheduledMessages { + if !strongSelf.presentationInterfaceState.isScheduledMessages && time != scheduleWhenOnlineTimestamp { strongSelf.openScheduledMessages() } } @@ -5553,7 +5551,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G strongSelf.presentScheduleTimePicker(completion: { [weak self] time in if let strongSelf = self { done(time) - if !strongSelf.presentationInterfaceState.isScheduledMessages { + if !strongSelf.presentationInterfaceState.isScheduledMessages && time != scheduleWhenOnlineTimestamp { strongSelf.openScheduledMessages() } } @@ -5745,7 +5743,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G strongSelf.presentScheduleTimePicker(completion: { [weak self] time in if let strongSelf = self { done(time) - if !strongSelf.presentationInterfaceState.isScheduledMessages { + if !strongSelf.presentationInterfaceState.isScheduledMessages && time != scheduleWhenOnlineTimestamp { strongSelf.openScheduledMessages() } } @@ -7887,7 +7885,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } private func displaySendingOptionsTooltip() { - guard let rect = self.chatDisplayNode.frameForInputActionButton() else { + guard let rect = self.chatDisplayNode.frameForInputActionButton(), self.effectiveNavigationController?.topViewController === self else { return } self.sendingOptionsTooltipController?.dismiss() @@ -8165,9 +8163,12 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } private func openScheduledMessages() { + guard let navigationController = self.effectiveNavigationController, navigationController.topViewController == self else { + return + } let controller = ChatControllerImpl(context: self.context, chatLocation: self.chatLocation, subject: .scheduledMessages) controller.navigationPresentation = .modal - self.effectiveNavigationController?.pushViewController(controller) + navigationController.pushViewController(controller) } private func presentScheduleTimePicker(selectedTime: Int32? = nil, dismissByTapOutside: Bool = true, completion: @escaping (Int32) -> Void) {