Ship full-featured mobile clients with auth, payments, QRs, push notifications, and iOS polish including Figtree typography, app icons, and QR previews. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user