Skip to content
Snippets Groups Projects
Commit 3f1517d0 authored by Bruno Muniz's avatar Bruno Muniz :apple:
Browse files

Implemented searching cancellation

parent b851fb01
No related branches found
No related tags found
2 merge requests!54Releasing 1.1.4,!50Search UI 2.0
import Models
import XXModels
import Foundation
import Combine
extension Session {
public func search(fact: String) -> AnyPublisher<Contact, Error> {
Deferred {
Future { promise in
guard let ud = self.client.userDiscovery else {
let error = NSError(domain: "", code: 0)
promise(.failure(error))
return
}
do {
try self.client.bindings.nodeRegistrationStatus()
try ud.search(fact: fact) {
switch $0 {
case .success(let contact):
promise(.success(contact))
case .failure(let error):
promise(.failure(error))
}
}
} catch {
promise(.failure(error))
}
}
}.eraseToAnyPublisher()
}
public func search(fact: String, _ completion: @escaping (Result<Contact, Error>) -> Void) throws {
guard let ud = client.userDiscovery else { return }
try client.bindings.nodeRegistrationStatus()
......
......@@ -66,4 +66,6 @@ public protocol SessionType {
members: [Contact],
_ completion: @escaping (Result<GroupInfo, Error>) -> Void
)
func search(fact: String) -> AnyPublisher<Contact, Error>
}
......@@ -30,6 +30,7 @@ final class SearchLeftViewModel {
stateSubject.eraseToAnyPublisher()
}
private var searchCancellables = Set<AnyCancellable>()
private let successSubject = PassthroughSubject<Contact, Never>()
private let hudSubject = CurrentValueSubject<HUDStatus, Never>(.none)
private let stateSubject = CurrentValueSubject<SearchLeftViewState, Never>(.init())
......@@ -46,6 +47,12 @@ final class SearchLeftViewModel {
stateSubject.value.item = item
}
func didTapCancelSearch() {
searchCancellables.forEach { $0.cancel() }
searchCancellables.removeAll()
hudSubject.send(.none)
}
func didStartSearching() {
guard stateSubject.value.input.isEmpty == false else { return }
......@@ -58,23 +65,16 @@ final class SearchLeftViewModel {
content += stateSubject.value.country.code
}
do {
try session.search(fact: "\(prefix)\(content)") { [weak self] in
guard let self = self else { return }
switch $0 {
case .success(let contact):
self.hudSubject.send(.none)
self.appendToLocalSearch(contact)
case .failure(let error):
session.search(fact: "\(prefix)\(content)")
.sink { [unowned self] in
if case .failure(let error) = $0 {
self.appendToLocalSearch(nil)
self.hudSubject.send(.error(.init(with: error)))
}
}
} catch {
hudSubject.send(.error(.init(with: error)))
}
} receiveValue: { contact in
self.hudSubject.send(.none)
self.appendToLocalSearch(contact)
}.store(in: &searchCancellables)
}
func didTapRequest(contact: Contact) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment