60 lines
1.2 KiB
Swift
60 lines
1.2 KiB
Swift
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"
|
|
}
|
|
}
|