Something went wrong on our end
-
Bruno Muniz authoredBruno Muniz authored
ProfilePhoneViewModel.swift 1.95 KiB
import Shared
import Combine
import AppCore
import XXClient
import InputField
import Foundation
import Dependencies
import CombineSchedulers
import XXMessengerClient
import CountryListFeature
final class ProfilePhoneViewModel {
struct ViewState: Equatable {
var input: String = ""
var content: String?
var confirmationId: String?
var status: InputField.ValidationStatus = .unknown(nil)
var country: Country = .fromMyPhone()
}
@Dependency(\.app.bgQueue) var bgQueue
@Dependency(\.app.messenger) var messenger
@Dependency(\.app.hudManager) var hudManager
var statePublisher: AnyPublisher<ViewState, Never> {
stateSubject.eraseToAnyPublisher()
}
private let stateSubject = CurrentValueSubject<ViewState, Never>(.init())
func didInput(_ string: String) {
stateSubject.value.input = string
validate()
}
func clearUp() {
stateSubject.value.confirmationId = nil
}
func didChooseCountry(_ country: Country) {
stateSubject.value.country = country
validate()
}
func didTapNext() {
hudManager.show()
bgQueue.schedule { [weak self] in
guard let self else { return }
let content = "\(self.stateSubject.value.input)\(self.stateSubject.value.country.code)"
do {
let confirmationId = try self.messenger.ud.get()!.sendRegisterFact(
.init(type: .phone, value: content)
)
self.hudManager.hide()
self.stateSubject.value.content = content
self.stateSubject.value.confirmationId = confirmationId
} catch {
let xxError = CreateUserFriendlyErrorMessage.live(error.localizedDescription)
self.hudManager.show(.init(content: xxError))
}
}
}
private func validate() {
switch Validator.phone.validate((stateSubject.value.country.regex, stateSubject.value.input)) {
case .success:
stateSubject.value.status = .valid(nil)
case .failure(let error):
stateSubject.value.status = .invalid(error)
}
}
}