37 lines
1.1 KiB
Swift
37 lines
1.1 KiB
Swift
|
|
import Foundation
|
||
|
|
import LocalAuthentication
|
||
|
|
|
||
|
|
@MainActor
|
||
|
|
final class LoginViewModel: ObservableObject {
|
||
|
|
@Published var showMoreSheet = false
|
||
|
|
@Published var isAuthenticating = false
|
||
|
|
@Published var authError: String? = nil
|
||
|
|
|
||
|
|
var onAuthenticated: (() -> Void)?
|
||
|
|
|
||
|
|
func authenticateWithFaceID() {
|
||
|
|
isAuthenticating = true
|
||
|
|
authError = nil
|
||
|
|
let context = LAContext()
|
||
|
|
var error: NSError?
|
||
|
|
guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else {
|
||
|
|
authError = "Face ID not available"
|
||
|
|
isAuthenticating = false
|
||
|
|
return
|
||
|
|
}
|
||
|
|
context.evaluatePolicy(
|
||
|
|
.deviceOwnerAuthenticationWithBiometrics,
|
||
|
|
localizedReason: "Sign in to NASBackup"
|
||
|
|
) { [weak self] success, evalError in
|
||
|
|
Task { @MainActor in
|
||
|
|
self?.isAuthenticating = false
|
||
|
|
if success {
|
||
|
|
self?.onAuthenticated?()
|
||
|
|
} else {
|
||
|
|
self?.authError = evalError?.localizedDescription ?? "Authentication failed"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|