48 lines
1.4 KiB
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
|
|
}
|
|
}
|
|
}
|