Files
Gas-Tank-AR-App/GasTankAR/Views/LoginViewModel.swift

48 lines
1.4 KiB
Swift

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
}
}
}