61a0cc1f7d
CI / test (push) Has been cancelled
Bring the SwiftUI app in line with the Apple-native mock and keep pending approvals actionable from Live Activities and watch complications.
99 lines
2.8 KiB
Swift
99 lines
2.8 KiB
Swift
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
|
|
WindowGroup {
|
|
RootSceneContent(model: model)
|
|
.tint(IdP.tint)
|
|
.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 {
|
|
@ObservedObject var model: AppViewModel
|
|
|
|
var body: some View {
|
|
Group {
|
|
if model.session == nil {
|
|
LoginRootView(model: model)
|
|
} else if model.isShowingPairingSuccess {
|
|
PairingSuccessView()
|
|
} else {
|
|
#if os(macOS)
|
|
MenuBarPopover(model: model)
|
|
#else
|
|
HomeRootView(model: model)
|
|
#endif
|
|
}
|
|
}
|
|
.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)
|
|
}
|
|
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
|
.padding(32)
|
|
}
|
|
}
|