import Foundation import Observation @MainActor @Observable final class LoginViewModel { var salesCode = "" { didSet { errorMessage = nil } } private(set) var isLoading = false private(set) var errorMessage: LocalizedStringResource? @ObservationIgnored private let loginUseCase: any LoginUseCase init(loginUseCase: any LoginUseCase) { self.loginUseCase = loginUseCase } var canSubmit: Bool { SalesCodeValidator.isValid(salesCode) && !isLoading } func signIn() async -> LoginSession? { guard !isLoading else { return nil } errorMessage = nil isLoading = true defer { isLoading = false } do { let session = try await loginUseCase.execute(salesCode: salesCode) try Task.checkCancellation() return session } catch is CancellationError { return nil } catch { switch error as? LoginError { case .invalidSalesCode: errorMessage = "Bitte gib ein Kürzel mit mindestens 3 Zeichen ein." case .rejected: errorMessage = "Das Kürzel wurde nicht erkannt. Bitte prüfe deine Eingabe." default: errorMessage = "Die Anmeldung ist derzeit nicht möglich. Bitte versuche es erneut." } return nil } } }