Implement bank transfer app flows
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
import Foundation
|
||||
import Observation
|
||||
|
||||
@Observable
|
||||
final class AppViewModel {
|
||||
|
||||
enum Route: Equatable {
|
||||
case onboarding
|
||||
case login
|
||||
case lock
|
||||
case home
|
||||
}
|
||||
|
||||
private(set) var route: Route
|
||||
|
||||
init() {
|
||||
route = AppViewModel.initialRoute()
|
||||
}
|
||||
|
||||
// MARK: - Route transitions (called by child views)
|
||||
|
||||
func completeOnboarding() {
|
||||
UserDefaults.standard.set(true, forKey: "onboarding_done")
|
||||
route = .login
|
||||
}
|
||||
|
||||
func loginSucceeded() {
|
||||
route = AppViewModel.requiresLock() ? .lock : .home
|
||||
}
|
||||
|
||||
func unlock() {
|
||||
route = .home
|
||||
}
|
||||
|
||||
func lock() {
|
||||
route = .lock
|
||||
}
|
||||
|
||||
func logout() {
|
||||
route = .login
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
private static func initialRoute() -> Route {
|
||||
guard UserDefaults.standard.bool(forKey: "onboarding_done") else {
|
||||
return .onboarding
|
||||
}
|
||||
guard CredentialStore.shared.hasAnyCredentials() else {
|
||||
return .login
|
||||
}
|
||||
return requiresLock() ? .lock : .home
|
||||
}
|
||||
|
||||
private static func requiresLock() -> Bool {
|
||||
let method = UserDefaults.standard.string(forKey: "security_method") ?? ""
|
||||
return !method.isEmpty && method != "none"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user