import SwiftUI struct ContentView: View { @Environment(AppState.self) private var app @Environment(\.scenePhase) private var scenePhase /// Bootstrap fertig — Signal an den Splash, Phase 2 zu starten. @State private var isReadyToDismiss = false /// Splash hat seine Fade-Phase ausgespielt und kann aus dem View-Tree raus. @State private var splashFinished = false var body: some View { ZStack { mainContent if !splashFinished { SplashScreenView(isReady: isReadyToDismiss) { splashFinished = true } .zIndex(10) } } .task { await boot() } .onChange(of: scenePhase) { _, newPhase in if newPhase == .active { app.onScenePhaseActive() } } } @ViewBuilder private var mainContent: some View { Group { if app.auth.isLoggedIn { MainView() } else { LoginView() } } .environment(\.locale, Locale(identifier: app.language)) #if os(iOS) .frame(maxWidth: .infinity, maxHeight: .infinity) #else .frame(minWidth: 900, minHeight: 600) #endif } private func boot() async { await app.bootstrap() // SplashScreenView wartet selbst auf seine Mindest-Loop-Zeit, daher // kein künstlicher Sleep mehr hier nötig. Sobald isReadyToDismiss // gesetzt wird, fängt der Splash mit Phase 2 an und ruft am Ende // seinen onComplete-Callback (splashFinished = true). isReadyToDismiss = true } }