mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
70 lines
2.6 KiB
Swift
70 lines
2.6 KiB
Swift
import Foundation
|
|
import Postbox
|
|
import SwiftSignalKit
|
|
|
|
import SyncCore
|
|
|
|
private func searchLocalGroupMembers(postbox: Postbox, peerId: PeerId, query: String) -> Signal<[Peer], NoError> {
|
|
return peerParticipants(postbox: postbox, id: peerId)
|
|
|> map { peers -> [Peer] in
|
|
let normalizedQuery = query.lowercased()
|
|
|
|
if normalizedQuery.isEmpty {
|
|
return peers
|
|
}
|
|
|
|
return peers.filter { peer in
|
|
if peer.debugDisplayTitle.isEmpty {
|
|
return false
|
|
}
|
|
if peer.indexName.matchesByTokens(normalizedQuery) {
|
|
return true
|
|
}
|
|
if let addressName = peer.addressName, addressName.lowercased().hasPrefix(normalizedQuery) {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
}
|
|
}
|
|
|
|
public func searchGroupMembers(postbox: Postbox, network: Network, accountPeerId: PeerId, peerId: PeerId, query: String) -> Signal<[Peer], NoError> {
|
|
if peerId.namespace == Namespaces.Peer.CloudChannel && !query.isEmpty {
|
|
return searchLocalGroupMembers(postbox: postbox, peerId: peerId, query: query)
|
|
|> mapToSignal { local -> Signal<[Peer], NoError> in
|
|
let localResult: Signal<[Peer], NoError>
|
|
if local.isEmpty {
|
|
localResult = .complete()
|
|
} else {
|
|
localResult = .single(local)
|
|
}
|
|
return localResult
|
|
|> then(
|
|
channelMembers(postbox: postbox, network: network, accountPeerId: accountPeerId, peerId: peerId, category: .recent(.search(query)))
|
|
|> map { participants -> [Peer] in
|
|
var result: [Peer] = local
|
|
let existingIds = Set(local.map { $0.id })
|
|
let filtered: [Peer]
|
|
if let participants = participants {
|
|
filtered = participants.map({ $0.peer }).filter({ peer in
|
|
if existingIds.contains(peer.id) {
|
|
return false
|
|
}
|
|
if peer.debugDisplayTitle.isEmpty {
|
|
return false
|
|
}
|
|
return true
|
|
})
|
|
} else {
|
|
filtered = []
|
|
}
|
|
result.append(contentsOf: filtered)
|
|
return result
|
|
}
|
|
)
|
|
}
|
|
} else {
|
|
return searchLocalGroupMembers(postbox: postbox, peerId: peerId, query: query)
|
|
}
|
|
}
|