import SwiftUI enum AppRoute: Hashable { case landing, login, register, pinLock, pinSetup, home case profile, settings, security, wallet, billing, support } struct AppRouter: View { @EnvironmentObject private var session: SessionStore @State private var path = NavigationPath() @State private var booted = false @State private var initialRoute: AppRoute = .landing var body: some View { NavigationStack(path: $path) { Group { if !booted { SplashView(onFinish: handleSplashFinish) } else { rootView } } .navigationDestination(for: AppRoute.self) { route in destination(for: route) } } } @ViewBuilder private var rootView: some View { switch initialRoute { case .pinLock: PinLockView(onUnlocked: { goHome() }) case .home: HomeView( onNavigate: { path.append($0) }, onLoggedOut: { resetToLanding() } ) default: LandingView( onSignIn: { path.append(AppRoute.login) }, onCreateAccount: { path.append(AppRoute.register) } ) } } @ViewBuilder private func destination(for route: AppRoute) -> some View { switch route { case .landing: LandingView( onSignIn: { path.append(AppRoute.login) }, onCreateAccount: { path.append(AppRoute.register) } ) case .login: LoginView( onLoggedIn: { goHome() }, onCreateAccount: { path.removeLast(path.count) path.append(AppRoute.register) }, onBack: { path.removeLast() } ) case .register: RegisterView( onRegistered: { goHome() }, onSignIn: { path.removeLast(path.count) path.append(AppRoute.login) }, onBack: { path.removeLast() } ) case .pinLock: PinLockView(onUnlocked: { goHome() }) case .pinSetup: PinSetupView(onPinSet: { goHome() }) case .home: HomeView(onNavigate: { path.append($0) }, onLoggedOut: { resetToLanding() }) case .profile: ProfileView(onBack: { path.removeLast() }) case .settings: SettingsView(onBack: { path.removeLast() }) case .security: SecurityView(onBack: { path.removeLast() }) case .wallet: WalletView(onBack: { path.removeLast() }) case .billing: BillingView(onBack: { path.removeLast() }) case .support: SupportView(onBack: { path.removeLast() }) } } private func handleSplashFinish() { booted = true if session.isLoggedIn { initialRoute = PinStore.shared.hasPin() ? .pinLock : .home } else { initialRoute = .landing } } private func goHome() { path = NavigationPath() initialRoute = .home booted = true } private func resetToLanding() { path = NavigationPath() initialRoute = .landing booted = true } }