mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
83 lines
3.8 KiB
Swift
83 lines
3.8 KiB
Swift
import Foundation
|
|
import Postbox
|
|
import SwiftSignalKit
|
|
import TelegramApi
|
|
import MtProtoKit
|
|
|
|
func _internal_requestUpdatePeerIsBlocked(account: Account, peerId: PeerId, isBlocked: Bool) -> Signal<Void, NoError> {
|
|
return account.postbox.transaction { transaction -> Signal<Void, NoError> in
|
|
if let peer = transaction.getPeer(peerId), let inputPeer = apiInputPeer(peer) {
|
|
let signal: Signal<Api.Bool, MTRpcError>
|
|
if isBlocked {
|
|
signal = account.network.request(Api.functions.contacts.block(flags: 0, id: inputPeer))
|
|
} else {
|
|
signal = account.network.request(Api.functions.contacts.unblock(flags: 0, id: inputPeer))
|
|
}
|
|
return signal
|
|
|> map(Optional.init)
|
|
|> `catch` { _ -> Signal<Api.Bool?, NoError> in
|
|
return .single(nil)
|
|
}
|
|
|> mapToSignal { result -> Signal<Void, NoError> in
|
|
return account.postbox.transaction { transaction -> Void in
|
|
if result != nil {
|
|
transaction.updatePeerCachedData(peerIds: Set([peerId]), update: { _, current in
|
|
let previous: CachedUserData
|
|
if let current = current as? CachedUserData {
|
|
previous = current
|
|
} else {
|
|
previous = CachedUserData()
|
|
}
|
|
return previous.withUpdatedIsBlocked(isBlocked)
|
|
})
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
return .complete()
|
|
}
|
|
} |> switchToLatest
|
|
}
|
|
|
|
func _internal_requestUpdatePeerIsBlockedFromStories(account: Account, peerId: PeerId, isBlocked: Bool) -> Signal<Void, NoError> {
|
|
return account.postbox.transaction { transaction -> Signal<Void, NoError> in
|
|
if let peer = transaction.getPeer(peerId), let inputPeer = apiInputPeer(peer) {
|
|
let flags: Int32 = 1 << 0
|
|
let signal: Signal<Api.Bool, MTRpcError>
|
|
if isBlocked {
|
|
signal = account.network.request(Api.functions.contacts.block(flags: flags, id: inputPeer))
|
|
} else {
|
|
signal = account.network.request(Api.functions.contacts.unblock(flags: flags, id: inputPeer))
|
|
}
|
|
return signal
|
|
|> map(Optional.init)
|
|
|> `catch` { _ -> Signal<Api.Bool?, NoError> in
|
|
return .single(nil)
|
|
}
|
|
|> mapToSignal { result -> Signal<Void, NoError> in
|
|
return account.postbox.transaction { transaction -> Void in
|
|
if result != nil {
|
|
transaction.updatePeerCachedData(peerIds: Set([peerId]), update: { _, current in
|
|
let previous: CachedUserData
|
|
if let current = current as? CachedUserData {
|
|
previous = current
|
|
} else {
|
|
previous = CachedUserData()
|
|
}
|
|
var userFlags = previous.flags
|
|
if isBlocked {
|
|
userFlags.insert(.isBlockedFromStories)
|
|
} else {
|
|
userFlags.remove(.isBlockedFromStories)
|
|
}
|
|
return previous.withUpdatedFlags(userFlags)
|
|
})
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
return .complete()
|
|
}
|
|
} |> switchToLatest
|
|
}
|