mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-15 21:45:19 +00:00
81 lines
4.1 KiB
Swift
81 lines
4.1 KiB
Swift
import Foundation
|
|
import Postbox
|
|
import SwiftSignalKit
|
|
|
|
|
|
private struct WrappedStickerPackCollectionInfo: Equatable {
|
|
let info: StickerPackCollectionInfo?
|
|
|
|
static func ==(lhs: WrappedStickerPackCollectionInfo, rhs: WrappedStickerPackCollectionInfo) -> Bool {
|
|
return lhs.info == rhs.info
|
|
}
|
|
}
|
|
|
|
public struct PeerSpecificStickerPackData {
|
|
public let packInfo: (StickerPackCollectionInfo.Accessor, [ItemCollectionItem])?
|
|
public let canSetup: Bool
|
|
}
|
|
|
|
func _internal_peerSpecificStickerPack(postbox: Postbox, network: Network, peerId: PeerId) -> Signal<PeerSpecificStickerPackData, NoError> {
|
|
if peerId.namespace == Namespaces.Peer.CloudChannel {
|
|
let signal: Signal<(WrappedStickerPackCollectionInfo, Bool), NoError> = postbox.combinedView(keys: [.cachedPeerData(peerId: peerId)])
|
|
|> map { view -> (WrappedStickerPackCollectionInfo, Bool) in
|
|
let dataView = view.views[.cachedPeerData(peerId: peerId)] as? CachedPeerDataView
|
|
return (WrappedStickerPackCollectionInfo(info: (dataView?.cachedPeerData as? CachedChannelData)?.stickerPack), (dataView?.cachedPeerData as? CachedChannelData)?.flags.contains(.canSetStickerSet) ?? false)
|
|
}
|
|
|> distinctUntilChanged(isEqual: { lhs, rhs -> Bool in
|
|
return lhs.0 == rhs.0 && lhs.1 == rhs.1
|
|
})
|
|
|
|
return signal
|
|
|> mapToSignal { info, canInstall -> Signal<PeerSpecificStickerPackData, NoError> in
|
|
if let info = info.info {
|
|
return _internal_cachedStickerPack(postbox: postbox, network: network, reference: .id(id: info.id.id, accessHash: info.accessHash), forceRemote: false)
|
|
|> map { result -> PeerSpecificStickerPackData in
|
|
if case let .result(info, items, _) = result {
|
|
return PeerSpecificStickerPackData(packInfo: (info, items), canSetup: canInstall)
|
|
} else {
|
|
return PeerSpecificStickerPackData(packInfo: nil, canSetup: canInstall)
|
|
}
|
|
}
|
|
} else {
|
|
return .single(PeerSpecificStickerPackData(packInfo: nil, canSetup: canInstall))
|
|
}
|
|
}
|
|
} else {
|
|
return .single(PeerSpecificStickerPackData(packInfo: nil, canSetup: false))
|
|
}
|
|
}
|
|
|
|
|
|
func _internal_peerSpecificEmojiPack(postbox: Postbox, network: Network, peerId: PeerId) -> Signal<PeerSpecificStickerPackData, NoError> {
|
|
if peerId.namespace == Namespaces.Peer.CloudChannel {
|
|
let signal: Signal<(WrappedStickerPackCollectionInfo, Bool), NoError> = postbox.combinedView(keys: [.cachedPeerData(peerId: peerId)])
|
|
|> map { view -> (WrappedStickerPackCollectionInfo, Bool) in
|
|
let dataView = view.views[.cachedPeerData(peerId: peerId)] as? CachedPeerDataView
|
|
return (WrappedStickerPackCollectionInfo(info: (dataView?.cachedPeerData as? CachedChannelData)?.emojiPack), (dataView?.cachedPeerData as? CachedChannelData)?.flags.contains(.canSetStickerSet) ?? false)
|
|
}
|
|
|> distinctUntilChanged(isEqual: { lhs, rhs -> Bool in
|
|
return lhs.0 == rhs.0 && lhs.1 == rhs.1
|
|
})
|
|
|
|
return signal
|
|
|> mapToSignal { info, canInstall -> Signal<PeerSpecificStickerPackData, NoError> in
|
|
if let info = info.info {
|
|
return _internal_cachedStickerPack(postbox: postbox, network: network, reference: .id(id: info.id.id, accessHash: info.accessHash), forceRemote: false)
|
|
|> map { result -> PeerSpecificStickerPackData in
|
|
if case let .result(info, items, _) = result {
|
|
return PeerSpecificStickerPackData(packInfo: (info, items), canSetup: canInstall)
|
|
} else {
|
|
return PeerSpecificStickerPackData(packInfo: nil, canSetup: canInstall)
|
|
}
|
|
}
|
|
} else {
|
|
return .single(PeerSpecificStickerPackData(packInfo: nil, canSetup: canInstall))
|
|
}
|
|
}
|
|
} else {
|
|
return .single(PeerSpecificStickerPackData(packInfo: nil, canSetup: false))
|
|
}
|
|
}
|