Skip to content
Snippets Groups Projects
Select Git revision
  • 5e79cdcb44dd15ed8ec0154ae079533060e91100
  • main default protected
  • dev protected
  • hotfixes-oct-2022
  • refactor/avatar-cell
  • 1.1.5
  • 1.1.4
  • 1.1.3
  • 1.1
  • 1.0.8
  • 1.0.7
  • 1.0.6
12 results

OnboardingEmailViewModel.swift

Blame
  • OnboardingEmailViewModel.swift 1.68 KiB
    import AppCore
    import Shared
    import Combine
    import XXClient
    import InputField
    import Foundation
    import CombineSchedulers
    import XXMessengerClient
    import ComposableArchitecture
    
    final class OnboardingEmailViewModel {
      struct ViewState: Equatable {
        var input: String = ""
        var confirmationId: String?
        var status: InputField.ValidationStatus = .unknown(nil)
      }
    
      @Dependency(\.app.bgQueue) var bgQueue
      @Dependency(\.app.messenger) var messenger
      @Dependency(\.hudManager) var hudManager
    
      var statePublisher: AnyPublisher<ViewState, Never> {
        stateSubject.eraseToAnyPublisher()
      }
    
      private let stateSubject = CurrentValueSubject<ViewState, Never>(.init())
    
      func clearUp() {
        stateSubject.value.confirmationId = nil
      }
    
      func didInput(_ string: String) {
        stateSubject.value.input = string
        validate()
      }
    
      func didTapNext() {
        hudManager.show()
        bgQueue.schedule { [weak self] in
          guard let self else { return }
          do {
            let confirmationId = try self.messenger.ud.tryGet()
              .sendRegisterFact(.init(
                type: .email,
                value: self.stateSubject.value.input
              )
            )
            self.hudManager.hide()
            self.stateSubject.value.confirmationId = confirmationId
          } catch {
            self.hudManager.hide()
            let xxError = CreateUserFriendlyErrorMessage.live(error.localizedDescription)
            self.stateSubject.value.status = .invalid(xxError)
          }
        }
      }
    
      private func validate() {
        switch Validator.email.validate(stateSubject.value.input) {
        case .success:
          stateSubject.value.status = .valid(nil)
        case .failure(let error):
          stateSubject.value.status = .invalid(error)
        }
      }
    }