import SwiftUI /// Welcher Bildschirm zu sehen ist, entscheidet allein `AppZustand.lage`. /// Jede Ansicht darunter darf davon ausgehen, dass es einen angemeldeten /// Client gibt. struct RootAnsicht: View { @Environment(AppZustand.self) private var zustand var body: some View { switch zustand.lage { case .startet: ProgressView() .frame(maxWidth: .infinity, maxHeight: .infinity) case .brauchtServer: ServerAnsicht() case .brauchtAnmeldung: AnmeldeAnsicht() case .brauchtZweitenFaktor: ZweiFaktorAnsicht() case .brauchtPasswortwechsel: PasswortWechselAnsicht() case .brauchtZweitenFaktorEinrichtung: ZweitenFaktorEinrichtenHinweis() case .bereit: Hauptnavigation() } } } /// Die Reiter. Auf dem iPhone unten, auf dem iPad als Seitenleiste – das /// erledigt `.sidebarAdaptable` von selbst. /// /// Reihenfolge nach Häufigkeit, nicht nach Umfang: Das Dashboard beantwortet /// die Frage, wegen der man die App öffnet. Konten und Einstellungen stehen /// hinten, weil man sie selten braucht. struct Hauptnavigation: View { var body: some View { TabView { Tab(String(localized: "reiter.dashboard"), systemImage: "square.grid.2x2") { NavigationStack { DashboardAnsicht() } } Tab(String(localized: "reiter.budget"), systemImage: "chart.pie") { NavigationStack { BudgetAnsicht() } } Tab(String(localized: "reiter.buchungen"), systemImage: "list.bullet.rectangle") { NavigationStack { BuchungsListe() } } Tab(String(localized: "reiter.abos"), systemImage: "arrow.triangle.2.circlepath") { NavigationStack { AboListe() } } Tab(String(localized: "reiter.konten"), systemImage: "wallet.bifold") { NavigationStack { KontenListe() } } Tab(String(localized: "reiter.einstellungen"), systemImage: "gearshape") { NavigationStack { EinstellungenAnsicht() } } } .tabViewStyle(.sidebarAdaptable) } }