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 Models
import XXModels import XXModels
import Foundation import Foundation
import Combine
extension Session { 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 { public func search(fact: String, _ completion: @escaping (Result<Contact, Error>) -> Void) throws {
guard let ud = client.userDiscovery else { return } guard let ud = client.userDiscovery else { return }
try client.bindings.nodeRegistrationStatus() try client.bindings.nodeRegistrationStatus()
......
...@@ -66,4 +66,6 @@ public protocol SessionType { ...@@ -66,4 +66,6 @@ public protocol SessionType {
members: [Contact], members: [Contact],
_ completion: @escaping (Result<GroupInfo, Error>) -> Void _ completion: @escaping (Result<GroupInfo, Error>) -> Void
) )
func search(fact: String) -> AnyPublisher<Contact, Error>
} }
...@@ -30,6 +30,7 @@ final class SearchLeftViewModel { ...@@ -30,6 +30,7 @@ final class SearchLeftViewModel {
stateSubject.eraseToAnyPublisher() stateSubject.eraseToAnyPublisher()
} }
private var searchCancellables = Set<AnyCancellable>()
private let successSubject = PassthroughSubject<Contact, Never>() private let successSubject = PassthroughSubject<Contact, Never>()
private let hudSubject = CurrentValueSubject<HUDStatus, Never>(.none) private let hudSubject = CurrentValueSubject<HUDStatus, Never>(.none)
private let stateSubject = CurrentValueSubject<SearchLeftViewState, Never>(.init()) private let stateSubject = CurrentValueSubject<SearchLeftViewState, Never>(.init())
...@@ -46,6 +47,12 @@ final class SearchLeftViewModel { ...@@ -46,6 +47,12 @@ final class SearchLeftViewModel {
stateSubject.value.item = item stateSubject.value.item = item
} }
func didTapCancelSearch() {
searchCancellables.forEach { $0.cancel() }
searchCancellables.removeAll()
hudSubject.send(.none)
}
func didStartSearching() { func didStartSearching() {
guard stateSubject.value.input.isEmpty == false else { return } guard stateSubject.value.input.isEmpty == false else { return }
...@@ -58,23 +65,16 @@ final class SearchLeftViewModel { ...@@ -58,23 +65,16 @@ final class SearchLeftViewModel {
content += stateSubject.value.country.code content += stateSubject.value.country.code
} }
do { session.search(fact: "\(prefix)\(content)")
try session.search(fact: "\(prefix)\(content)") { [weak self] in .sink { [unowned self] in
guard let self = self else { return } if case .failure(let error) = $0 {
switch $0 {
case .success(let contact):
self.hudSubject.send(.none)
self.appendToLocalSearch(contact)
case .failure(let error):
self.appendToLocalSearch(nil) self.appendToLocalSearch(nil)
self.hudSubject.send(.error(.init(with: error))) self.hudSubject.send(.error(.init(with: error)))
} }
} } receiveValue: { contact in
} catch { self.hudSubject.send(.none)
hudSubject.send(.error(.init(with: error))) self.appendToLocalSearch(contact)
} }.store(in: &searchCancellables)
} }
func didTapRequest(contact: Contact) { 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