import Foundation import TelegramApi import Postbox import SwiftSignalKit import MtProtoKit import SyncCore public func markAllChatsAsRead(postbox: Postbox, network: Network, stateManager: AccountStateManager) -> Signal { return network.request(Api.functions.messages.getDialogUnreadMarks()) |> map(Optional.init) |> `catch` { _ -> Signal<[Api.DialogPeer]?, NoError> in return .single(nil) } |> mapToSignal { result -> Signal in guard let result = result else { return .complete() } return postbox.transaction { transaction -> Signal in var signals: [Signal] = [] for peer in result { switch peer { case let .dialogPeer(peer): let peerId = peer.peerId if peerId.namespace == Namespaces.Peer.CloudChannel { if let inputChannel = transaction.getPeer(peerId).flatMap(apiInputChannel) { signals.append(network.request(Api.functions.channels.readHistory(channel: inputChannel, maxId: Int32.max - 1)) |> `catch` { _ -> Signal in return .single(.boolFalse) } |> mapToSignal { _ -> Signal in return .complete() }) } } else if peerId.namespace == Namespaces.Peer.CloudUser || peerId.namespace == Namespaces.Peer.CloudGroup { if let inputPeer = transaction.getPeer(peerId).flatMap(apiInputPeer) { signals.append(network.request(Api.functions.messages.readHistory(peer: inputPeer, maxId: Int32.max - 1)) |> map(Optional.init) |> `catch` { _ -> Signal in return .single(nil) } |> mapToSignal { result -> Signal in if let result = result { switch result { case let .affectedMessages(pts, ptsCount): stateManager.addUpdateGroups([.updatePts(pts: pts, ptsCount: ptsCount)]) } } return .complete() }) } } else { assertionFailure() } case .dialogPeerFolder: assertionFailure() } } let applyLocally = postbox.transaction { transaction -> Void in } return combineLatest(signals) |> mapToSignal { _ -> Signal in return .complete() } |> then(applyLocally) } |> switchToLatest } }