54 lines
1.6 KiB
Swift
54 lines
1.6 KiB
Swift
import Foundation
|
|
|
|
@MainActor
|
|
final class AuthViewModel: ObservableObject {
|
|
enum Mode: String, CaseIterable {
|
|
case login
|
|
case register
|
|
}
|
|
|
|
static let tokenKey = "bookibra.jwt"
|
|
static let emailKey = "bookibra.email"
|
|
|
|
@Published var mode: Mode = .login
|
|
@Published var email = ""
|
|
@Published var password = ""
|
|
@Published var isLoading = false
|
|
@Published var errorMessage: String?
|
|
|
|
private let authService: AuthServiceProtocol
|
|
private let keychain: KeychainStoreProtocol
|
|
|
|
init(authService: AuthServiceProtocol, keychain: KeychainStoreProtocol) {
|
|
self.authService = authService
|
|
self.keychain = keychain
|
|
}
|
|
|
|
func submit(onSuccess: @escaping () -> Void) async {
|
|
guard !email.isEmpty, !password.isEmpty else {
|
|
errorMessage = "E-posta ve şifre gerekli"
|
|
return
|
|
}
|
|
|
|
isLoading = true
|
|
defer { isLoading = false }
|
|
|
|
do {
|
|
let response: AuthResponse
|
|
switch mode {
|
|
case .login:
|
|
response = try await authService.login(email: email, password: password)
|
|
case .register:
|
|
response = try await authService.register(email: email, password: password)
|
|
}
|
|
|
|
_ = try await authService.profile(token: response.token)
|
|
_ = keychain.save(response.token, for: Self.tokenKey)
|
|
_ = keychain.save(response.user.email, for: Self.emailKey)
|
|
onSuccess()
|
|
} catch {
|
|
errorMessage = error.localizedDescription
|
|
}
|
|
}
|
|
}
|