import Foundation import Postbox import SwiftSignalKit import TelegramApi import SyncCore public enum ServerProvidedSuggestion: String { case autoarchivePopular = "AUTOARCHIVE_POPULAR" case newcomerTicks = "NEWCOMER_TICKS" } public func getServerProvidedSuggestions(postbox: Postbox) -> Signal<[ServerProvidedSuggestion], NoError> { let key: PostboxViewKey = .preferences(keys: Set([PreferencesKeys.appConfiguration])) return postbox.combinedView(keys: [key]) |> map { views -> [ServerProvidedSuggestion] in guard let view = views.views[key] as? PreferencesView else { return [] } guard let appConfiguration = view.values[PreferencesKeys.appConfiguration] as? AppConfiguration else { return [] } guard let data = appConfiguration.data, let list = data["pending_suggestions"] as? [String] else { return [] } return list.compactMap { item -> ServerProvidedSuggestion? in return ServerProvidedSuggestion(rawValue: item) } } |> distinctUntilChanged } public func dismissServerProvidedSuggestion(account: Account, suggestion: ServerProvidedSuggestion) -> Signal { return account.network.request(Api.functions.help.dismissSuggestion(peer: .inputPeerEmpty, suggestion: suggestion.rawValue)) |> `catch` { _ -> Signal in return .single(.boolFalse) } |> ignoreValues } public enum PeerSpecificServerProvidedSuggestion: String { case convertToGigagroup = "CONVERT_TO_GIGAGROUP" } public func getPeerSpecificServerProvidedSuggestions(postbox: Postbox, peerId: PeerId) -> Signal<[PeerSpecificServerProvidedSuggestion], NoError> { return postbox.peerView(id: peerId) |> map { view in if let cachedData = view.cachedData as? CachedChannelData { return cachedData.pendingSuggestions.compactMap { item -> PeerSpecificServerProvidedSuggestion? in return PeerSpecificServerProvidedSuggestion(rawValue: item) } } return [] } |> distinctUntilChanged } public func dismissPeerSpecificServerProvidedSuggestion(account: Account, peerId: PeerId, suggestion: PeerSpecificServerProvidedSuggestion) -> Signal { return account.postbox.loadedPeerWithId(peerId) |> mapToSignal { peer -> Signal in guard let inputPeer = apiInputPeer(peer) else { return .never() } return account.network.request(Api.functions.help.dismissSuggestion(peer: inputPeer, suggestion: suggestion.rawValue)) |> `catch` { _ -> Signal in return .single(.boolFalse) } |> ignoreValues } }