import Foundation import LocalAuthentication import os.log @MainActor final class LoginViewModel: ObservableObject { @Published var showMoreSheet = false @Published var isAuthenticating = false @Published var authError: String? = nil var onAuthenticated: (() -> Void)? private let logger = Logger(subsystem: "com.albert.nasbackup", category: "Login") func authenticateWithFaceID() { logger.info("Face ID authentication started") isAuthenticating = true authError = nil let context = LAContext() var error: NSError? guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else { let reason = error?.localizedDescription ?? "unknown" logger.error("Face ID not available: \(reason, privacy: .public)") authError = "Face ID not available" isAuthenticating = false return } context.evaluatePolicy( .deviceOwnerAuthenticationWithBiometrics, localizedReason: "Sign in to Kisani" ) { [weak self] success, evalError in Task { @MainActor in self?.isAuthenticating = false if success { self?.logger.info("Face ID authentication succeeded — advancing session") self?.onAuthenticated?() } else { let reason = evalError?.localizedDescription ?? "Authentication failed" self?.logger.error("Face ID authentication failed: \(reason, privacy: .public)") self?.authError = reason } } } } }