Files
swiftapp/swift/Sources/App/IDPGlobalApp.swift
T

99 lines
2.8 KiB
Swift
Raw Normal View History

2026-04-17 22:08:27 +02:00
import SwiftUI
@main
struct IDPGlobalApp: App {
@StateObject private var model = AppViewModel()
var body: some Scene {
#if os(macOS)
MenuBarExtra("idp.global", systemImage: "shield.lefthalf.filled") {
RootSceneContent(model: model)
.frame(minWidth: 400, minHeight: 560)
.tint(IdP.tint)
.task {
await model.bootstrap()
}
.alert("Something went wrong", isPresented: errorPresented) {
Button("OK") {
model.errorMessage = nil
}
} message: {
Text(model.errorMessage ?? "")
}
}
.menuBarExtraStyle(.window)
#else
2026-04-17 22:08:27 +02:00
WindowGroup {
RootSceneContent(model: model)
.tint(IdP.tint)
2026-04-17 22:08:27 +02:00
.task {
await model.bootstrap()
}
.alert("Something went wrong", isPresented: errorPresented) {
Button("OK") {
model.errorMessage = nil
}
} message: {
Text(model.errorMessage ?? "")
}
}
#endif
}
private var errorPresented: Binding<Bool> {
Binding(
get: { model.errorMessage != nil },
set: { isPresented in
if !isPresented {
model.errorMessage = nil
}
}
)
}
}
private struct RootSceneContent: View {
2026-04-17 22:08:27 +02:00
@ObservedObject var model: AppViewModel
var body: some View {
Group {
if model.session == nil {
LoginRootView(model: model)
} else if model.isShowingPairingSuccess {
PairingSuccessView()
2026-04-17 22:08:27 +02:00
} else {
#if os(macOS)
MenuBarPopover(model: model)
#else
2026-04-17 22:08:27 +02:00
HomeRootView(model: model)
#endif
2026-04-17 22:08:27 +02:00
}
}
2026-04-18 01:05:22 +02:00
.background {
Color.idpGroupedBackground.ignoresSafeArea()
}
.onOpenURL { url in
model.openDeepLink(url)
}
}
}
private struct PairingSuccessView: View {
var body: some View {
VStack(spacing: 18) {
Image(systemName: "checkmark.circle.fill")
.font(.system(size: 72, weight: .semibold))
.foregroundStyle(.green)
Text("Passport linked")
.font(.title2.weight(.semibold))
Text("Your device is ready to approve sign-ins.")
.font(.subheadline)
.foregroundStyle(.secondary)
2026-04-18 01:05:22 +02:00
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.padding(32)
2026-04-17 22:08:27 +02:00
}
}