diff --git a/PayForMe/Views/Projects/Manual/AddProjectManualViewModel.swift b/PayForMe/Views/Projects/Manual/AddProjectManualViewModel.swift index 777370c..defa90e 100644 --- a/PayForMe/Views/Projects/Manual/AddProjectManualViewModel.swift +++ b/PayForMe/Views/Projects/Manual/AddProjectManualViewModel.swift @@ -128,10 +128,10 @@ class AddProjectManualViewModel: ObservableObject { .eraseToAnyPublisher() } - var validatedInput: AnyPublisher { - return Publishers.CombineLatest3(validatedAddress, $projectName, $projectPassword) + lazy var validatedInput: AnyPublisher = { + Publishers.CombineLatest3(validatedAddress, $projectName, $projectPassword) .debounce(for: 1, scheduler: DispatchQueue.main) - .compactMap { server, token, password in + .compactMap { server, token, password -> Project? in if let address = server.address, address.isValidURL, !token.isEmpty, !password.isEmpty { guard let url = URL(string: address) else { return nil } return Project(name: token, password: password, token: token, backend: server.0, url: url) @@ -140,28 +140,35 @@ class AddProjectManualViewModel: ObservableObject { } } .removeDuplicates() + .share() .eraseToAnyPublisher() - } - - private var validatedServer: AnyPublisher { - validatedInput.flatMap { - project in - Future { promise in - Task { - do { - let testedProject = try await NetworkService.shared.getProjectName(project) - self.lastProjectTestedSuccessfully = testedProject - promise(.success(200)) - } catch { - promise(.success(-1)) + }() + + private lazy var validatedServer: AnyPublisher = { + validatedInput + .map { project -> AnyPublisher<(Project?, Int), Never> in + Future<(Project?, Int), Never> { promise in + Task { + do { + let testedProject = try await NetworkService.shared.getProjectName(project) + promise(.success((testedProject, 200))) + } catch { + promise(.success((nil, -1))) + } } } + .eraseToAnyPublisher() } - } - .removeDuplicates() - .receive(on: RunLoop.main) - .eraseToAnyPublisher() - } + .switchToLatest() + .receive(on: RunLoop.main) + .handleEvents(receiveOutput: { (project, _) in + self.lastProjectTestedSuccessfully = project + }) + .map { (_, statusCode) in statusCode } + .removeDuplicates() + .share() + .eraseToAnyPublisher() + }() private var errorTextPublisher: AnyPublisher { validatedServer diff --git a/PayForMe/Views/Projects/QRCodes/AddProjectQRViewModel.swift b/PayForMe/Views/Projects/QRCodes/AddProjectQRViewModel.swift index b355047..1456a04 100644 --- a/PayForMe/Views/Projects/QRCodes/AddProjectQRViewModel.swift +++ b/PayForMe/Views/Projects/QRCodes/AddProjectQRViewModel.swift @@ -44,13 +44,12 @@ class AddProjectQRViewModel: ObservableObject { .compactMap { $0 }, $name, $passwordText - .debounce(for: 0.5, scheduler: RunLoop.main) + .debounce(for: 1, scheduler: RunLoop.main) .compactMap { $0.isEmpty ? nil : $0 } .removeDuplicates() ) .map { url, token, password in self.isTestingSubject.send(.connecting) - print("\(url) \(token) \(password)") return Project(name: "", password: password, token: token, backend: .cospend, url: url) } .flatMap { project in