diff --git a/submodules/ChatListUI/Sources/ChatContextMenus.swift b/submodules/ChatListUI/Sources/ChatContextMenus.swift index 99e1293f84..f17e166741 100644 --- a/submodules/ChatListUI/Sources/ChatContextMenus.swift +++ b/submodules/ChatListUI/Sources/ChatContextMenus.swift @@ -281,12 +281,12 @@ func chatContextMenuItems(context: AccountContext, peerId: PeerId, promoInfo: Ch if isUnread { items.append(.action(ContextMenuActionItem(text: strings.ChatList_Context_MarkAsRead, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/MarkAsRead"), color: theme.contextMenu.primaryColor) }, action: { _, f in - let _ = togglePeerUnreadMarkInteractively(postbox: context.account.postbox, viewTracker: context.account.viewTracker, peerId: peerId).start() + let _ = context.engine.messages.togglePeersUnreadMarkInteractively(peerIds: [peerId], setToValue: nil).start() f(.default) }))) } else { items.append(.action(ContextMenuActionItem(text: strings.ChatList_Context_MarkAsUnread, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/MarkAsUnread"), color: theme.contextMenu.primaryColor) }, action: { _, f in - let _ = togglePeerUnreadMarkInteractively(postbox: context.account.postbox, viewTracker: context.account.viewTracker, peerId: peerId).start() + let _ = context.engine.messages.togglePeersUnreadMarkInteractively(peerIds: [peerId], setToValue: nil).start() f(.default) }))) } diff --git a/submodules/ChatListUI/Sources/ChatListController.swift b/submodules/ChatListUI/Sources/ChatListController.swift index 53f52e0bae..d9c1232f4b 100644 --- a/submodules/ChatListUI/Sources/ChatListController.swift +++ b/submodules/ChatListUI/Sources/ChatListController.swift @@ -1968,7 +1968,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController let filterItems = chatListFilterItems(context: self.context) var notifiedFirstUpdate = false self.filterDisposable.set((combineLatest(queue: .mainQueue(), - self.context.account.postbox.combinedView(keys: [ + self.context.account.postbox.combinedView(keys: [ preferencesKey ]), filterItems, @@ -2421,18 +2421,12 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController if case .left = action { let signal: Signal var completion: (() -> Void)? - let context = self.context if !peerIds.isEmpty { self.chatListDisplayNode.containerNode.currentItemNode.setCurrentRemovingPeerId(peerIds.first!) completion = { [weak self] in self?.chatListDisplayNode.containerNode.currentItemNode.setCurrentRemovingPeerId(nil) } - signal = self.context.account.postbox.transaction { transaction -> Void in - for peerId in peerIds { - togglePeerUnreadMarkInteractively(transaction: transaction, viewTracker: context.account.viewTracker, peerId: peerId, setToValue: false) - } - } - |> ignoreValues + signal = self.context.engine.messages.togglePeersUnreadMarkInteractively(peerIds: Array(peerIds), setToValue: false) } else { let groupId = self.groupId let filterPredicate: ChatListFilterPredicate? diff --git a/submodules/ChatListUI/Sources/Node/ChatListNode.swift b/submodules/ChatListUI/Sources/Node/ChatListNode.swift index c7532572df..53def46ae2 100644 --- a/submodules/ChatListUI/Sources/Node/ChatListNode.swift +++ b/submodules/ChatListUI/Sources/Node/ChatListNode.swift @@ -885,7 +885,7 @@ public final class ChatListNode: ListView { return } self?.setCurrentRemovingPeerId(peerId) - let _ = (togglePeerUnreadMarkInteractively(postbox: context.account.postbox, viewTracker: context.account.viewTracker, peerId: peerId) + let _ = (context.engine.messages.togglePeersUnreadMarkInteractively(peerIds: [peerId], setToValue: nil) |> deliverOnMainQueue).start(completed: { self?.updateState { state in var state = state diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/ApplyMaxReadIndexInteractively.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/ApplyMaxReadIndexInteractively.swift index 22985d0bcb..6416e61c27 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/ApplyMaxReadIndexInteractively.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/ApplyMaxReadIndexInteractively.swift @@ -109,13 +109,13 @@ func applySecretOutgoingMessageReadActions(transaction: Transaction, id: Message } } -public func togglePeerUnreadMarkInteractively(postbox: Postbox, viewTracker: AccountViewTracker, peerId: PeerId, setToValue: Bool? = nil) -> Signal { +func _internal_togglePeerUnreadMarkInteractively(postbox: Postbox, viewTracker: AccountViewTracker, peerId: PeerId, setToValue: Bool? = nil) -> Signal { return postbox.transaction { transaction -> Void in - togglePeerUnreadMarkInteractively(transaction: transaction, viewTracker: viewTracker, peerId: peerId, setToValue: setToValue) + _internal_togglePeerUnreadMarkInteractively(transaction: transaction, viewTracker: viewTracker, peerId: peerId, setToValue: setToValue) } } -public func togglePeerUnreadMarkInteractively(transaction: Transaction, viewTracker: AccountViewTracker, peerId: PeerId, setToValue: Bool? = nil) { +func _internal_togglePeerUnreadMarkInteractively(transaction: Transaction, viewTracker: AccountViewTracker, peerId: PeerId, setToValue: Bool? = nil) { let principalNamespace: MessageId.Namespace if peerId.namespace == Namespaces.Peer.SecretChat { principalNamespace = Namespaces.Message.SecretIncoming @@ -178,6 +178,6 @@ public func clearPeerUnseenReactionsInteractively(account: Account, peerId: Peer func _internal_markAllChatsAsReadInteractively(transaction: Transaction, viewTracker: AccountViewTracker, groupId: PeerGroupId, filterPredicate: ChatListFilterPredicate?) { for peerId in transaction.getUnreadChatListPeerIds(groupId: groupId, filterPredicate: filterPredicate) { - togglePeerUnreadMarkInteractively(transaction: transaction, viewTracker: viewTracker, peerId: peerId, setToValue: false) + _internal_togglePeerUnreadMarkInteractively(transaction: transaction, viewTracker: viewTracker, peerId: peerId, setToValue: false) } } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/TelegramEngineMessages.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/TelegramEngineMessages.swift index 0a617c3b1f..7a6ec19451 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/TelegramEngineMessages.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/TelegramEngineMessages.swift @@ -406,5 +406,14 @@ public extension TelegramEngine { return transaction.getRelativeUnreadChatListIndex(filtered: filtered, position: position._asPosition(), groupId: groupId._asGroup()) } } + + public func togglePeersUnreadMarkInteractively(peerIds: [EnginePeer.Id], setToValue: Bool?) -> Signal { + return self.account.postbox.transaction { transaction -> Void in + for peerId in peerIds { + _internal_togglePeerUnreadMarkInteractively(transaction: transaction, viewTracker: self.account.viewTracker, peerId: peerId, setToValue: setToValue) + } + } + |> ignoreValues + } } } diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index 9cc9ee7d63..e5c57e7e9f 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -247,7 +247,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G return self.presentationInterfaceState.interfaceState.selectionState?.selectedIds } - private var cachedDataPromise = Promise() + private var themeEmoticonPromise = Promise() private var chatTitleView: ChatTitleView? private var leftNavigationButton: ChatNavigationButton? @@ -4664,18 +4664,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G }) } - let themeEmoticon: Signal = self.cachedDataPromise.get() - |> map { cachedData -> String? in - if let cachedData = cachedData as? CachedUserData { - return cachedData.themeEmoticon - } else if let cachedData = cachedData as? CachedGroupData { - return cachedData.themeEmoticon - } else if let cachedData = cachedData as? CachedChannelData { - return cachedData.themeEmoticon - } else { - return nil - } - } + let themeEmoticon: Signal = self.themeEmoticonPromise.get() |> distinctUntilChanged let themeSettings = context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.presentationThemeSettings]) @@ -5569,15 +5558,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G let topPinnedMessage: Signal = self.topPinnedMessageSignal(latest: false) if let peerId = self.chatLocation.peerId { - let _ = (self.context.account.postbox.transaction { transaction -> CachedPeerData? in - return transaction.getPeerCachedData(peerId: peerId) - }).start(next: { [weak self] cachedData in - if let strongSelf = self { - strongSelf.cachedDataPromise.set(.single(cachedData)) - } - }) + self.themeEmoticonPromise.set(self.context.engine.data.get(TelegramEngine.EngineData.Item.Peer.ThemeEmoticon(id: peerId))) } else { - self.cachedDataPromise.set(.single(nil)) + self.themeEmoticonPromise.set(.single(nil)) } if let peerId = self.chatLocation.peerId { @@ -5586,7 +5569,16 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G let (cachedData, messages) = cachedDataAndMessages if cachedData != nil { - strongSelf.cachedDataPromise.set(.single(cachedData)) + var themeEmoticon: String? = nil + if let cachedData = cachedData as? CachedUserData { + themeEmoticon = cachedData.themeEmoticon + } else if let cachedData = cachedData as? CachedGroupData { + themeEmoticon = cachedData.themeEmoticon + } else if let cachedData = cachedData as? CachedChannelData { + themeEmoticon = cachedData.themeEmoticon + } + + strongSelf.themeEmoticonPromise.set(.single(themeEmoticon)) } var pinnedMessageId: MessageId? @@ -15944,22 +15936,13 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G return animatedEmojiStickers } - let _ = (combineLatest(queue: Queue.mainQueue(), self.cachedDataPromise.get(), animatedEmojiStickers) - |> take(1)).start(next: { [weak self] cachedData, animatedEmojiStickers in + let _ = (combineLatest(queue: Queue.mainQueue(), self.themeEmoticonPromise.get(), animatedEmojiStickers) + |> take(1)).start(next: { [weak self] themeEmoticon, animatedEmojiStickers in guard let strongSelf = self else { return } - let selectedEmoticon: String? - if let cachedData = cachedData as? CachedUserData { - selectedEmoticon = cachedData.themeEmoticon - } else if let cachedData = cachedData as? CachedGroupData { - selectedEmoticon = cachedData.themeEmoticon - } else if let cachedData = cachedData as? CachedChannelData { - selectedEmoticon = cachedData.themeEmoticon - } else { - selectedEmoticon = nil - } + let selectedEmoticon: String? = themeEmoticon let controller = ChatThemeScreen(context: context, updatedPresentationData: strongSelf.updatedPresentationData, animatedEmojiStickers: animatedEmojiStickers, initiallySelectedEmoticon: selectedEmoticon, peerName: strongSelf.presentationInterfaceState.renderedPeer?.chatMainPeer.flatMap(EnginePeer.init)?.compactDisplayTitle ?? "", previewTheme: { [weak self] emoticon, dark in if let strongSelf = self {