import Postbox import TelegramApi import SwiftSignalKit import SyncCore public enum ChannelHistoryAvailabilityError { case generic case hasNotPermissions } public func updateChannelHistoryAvailabilitySettingsInteractively(postbox: Postbox, network: Network, accountStateManager: AccountStateManager, peerId: PeerId, historyAvailableForNewMembers: Bool) -> Signal { return postbox.transaction { transaction -> Peer? in return transaction.getPeer(peerId) } |> castError(ChannelHistoryAvailabilityError.self) |> mapToSignal { peer in guard let peer = peer, let inputChannel = apiInputChannel(peer) else { return .fail(.generic) } return network.request(Api.functions.channels.togglePreHistoryHidden(channel: inputChannel, enabled: historyAvailableForNewMembers ? .boolFalse : .boolTrue)) |> `catch` { error -> Signal in if error.errorDescription == "CHAT_ADMIN_REQUIRED" { return .fail(.hasNotPermissions) } return .fail(.generic) } |> mapToSignal { updates -> Signal in accountStateManager.addUpdates(updates) return postbox.transaction { transaction -> Void in transaction.updatePeerCachedData(peerIds: [peerId], update: { peerId, currentData in if let currentData = currentData as? CachedChannelData { var flags = currentData.flags if historyAvailableForNewMembers { flags.insert(.preHistoryEnabled) } else { flags.remove(.preHistoryEnabled) } return currentData.withUpdatedFlags(flags) } else { return currentData } }) } |> castError(ChannelHistoryAvailabilityError.self) } } }