import Shared import Combine import InputField import AppResources struct NicknameViewState { var nickname: String = "" var status: InputField.ValidationStatus = .unknown(nil) } final class NicknameViewModel { // MARK: Properties var state: AnyPublisher<NicknameViewState, Never> { stateRelay.eraseToAnyPublisher() } var done: AnyPublisher<String, Never> { doneRelay.eraseToAnyPublisher() } private let doneRelay = PassthroughSubject<String, Never>() private let stateRelay = CurrentValueSubject<NicknameViewState, Never>(.init()) // MARK: Public func didInput(_ string: String) { stateRelay.value.nickname = string validate() } func didTapSave() { doneRelay.send(stateRelay.value.nickname.trimmingCharacters(in: .whitespacesAndNewlines)) } // MARK: Private private func validate() { if stateRelay.value.nickname.trimmingCharacters(in: .whitespacesAndNewlines).count >= 1 { stateRelay.value.status = .valid(nil) } else { stateRelay.value.status = .invalid(Localized.Contact.Nickname.minimum) } } }