77
88import Foundation
99import SwiftUI
10+ import LocalAuthentication
1011
11- @MainActor
1212class PosmLoginViewModel : ObservableObject {
1313 @Published var username : String = " "
1414 @Published var password : String = " "
1515 @Published var hasLoginFailed : Bool = false
16+ @Published var loginFailedMessage : String ? = nil
1617 @Published var isLoginSuccess : Bool = false
1718 @Published var errorMessage : String ?
1819 @Published var isLoading = false
1920 @Published var shouldShowValidationAlert : Bool = false
21+ @Published var showBiometricPrompt = false
2022
2123 @AppStorage ( " loggedIn " ) private var loggedIn : Bool = false
2224
@@ -28,6 +30,7 @@ class PosmLoginViewModel: ObservableObject {
2830 } else if password. isEmpty {
2931 errorMessage = " Password is required. "
3032 } else {
33+ errorMessage = nil
3134 return true
3235 }
3336
@@ -43,13 +46,57 @@ class PosmLoginViewModel: ObservableObject {
4346 SessionManager . shared. performLogin ( username: username, password: password, environment: environment) { [ weak self] success, error in
4447 guard let self = self else { return }
4548
46- DispatchQueue . main. async {
47- self . isLoading = false
49+ self . isLoading = false
50+ self . loggedIn = success
51+ let env = APIConfiguration . shared. environment
52+ if success {
53+ if canEvaluateBiometrics ( ) {
54+ if !SessionManager. shared. hasDeclinedBiometric ( for: env) {
55+ if !SessionManager. shared. isBiometricEnabled ( for: env) ||
56+ ( SessionManager . shared. isBiometricEnabled ( for: env) && self . username != KeychainManager . load ( . username, for: env) ) {
57+ self . showBiometricPrompt = true
58+ return
59+ }
60+ }
61+ }
4862 self . isLoginSuccess = success
63+ } else {
4964 self . hasLoginFailed = !success
50- self . loggedIn = success
5165 }
5266 }
5367 }
68+
69+ private func canEvaluateBiometrics( ) -> Bool {
70+ BiometricAuthManager . canEvaluateBiometrics ( )
71+ }
72+
73+ func enableBiometrics( enable: Bool ) {
74+ guard self . loggedIn else {
75+ return
76+ }
77+ if enable, canEvaluateBiometrics ( ) {
78+ BiometricAuthManager . authenticate { [ weak self] result in
79+ switch result {
80+ case . success:
81+ if let username = self ? . username,
82+ let password = self ? . password {
83+ let env = APIConfiguration . shared. environment
84+ _ = KeychainManager . save ( . username, value: username, for: env)
85+ _ = KeychainManager . save ( . password, value: password, for: env)
86+ SessionManager . shared. setBiometricEnabled ( true , for: env)
87+ }
88+
89+ case . failure( let message) :
90+ print ( message)
91+ case . unavailable( let message) :
92+ print ( message)
93+ }
94+ self ? . isLoginSuccess = true
95+ }
96+ } else {
97+ SessionManager . shared. setDeclinedBiometric ( true , for: APIConfiguration . shared. environment)
98+ self . isLoginSuccess = true
99+ }
100+ }
54101}
55102
0 commit comments