Neuer Ordner ios/ mit dem Geruest: Netzwerkschicht, Modelle, Offline-Ablage, Texte in Deutsch und Englisch, Navigation, der komplette Anmeldeweg (Server waehlen, anmelden, zweiter Faktor, Pflicht-Passwortwechsel) und als erste Fachansicht die Kontenliste. Die Anmeldung laeuft einmal ueber das Sitzungs-Cookie, holt sich dabei eine App-Marke und legt sie in den Schluesselbund. Danach traegt nur noch der Header. Kein Passwort auf dem Geraet, kein Ablauf nach 30 Tagen. Der Code ist nie uebersetzt worden - hier gibt es kein Xcode. Geprueft ist dafuer jedes Modellfeld gegen echte Antworten des laufenden Backends; dabei kam heraus, dass created_at ohne Zeitzone und mit Mikrosekunden kommt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
54 lines
1.5 KiB
Swift
54 lines
1.5 KiB
Swift
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.
|
||
///
|
||
/// Stufe 1 hat erst zwei Einträge. Die weiteren kommen hier dazu, die
|
||
/// Anordnung bleibt.
|
||
struct Hauptnavigation: View {
|
||
var body: some View {
|
||
TabView {
|
||
Tab(String(localized: "reiter.konten"), systemImage: "wallet.bifold") {
|
||
NavigationStack { KontenListe() }
|
||
}
|
||
Tab(String(localized: "reiter.einstellungen"), systemImage: "gearshape") {
|
||
NavigationStack { EinstellungenAnsicht() }
|
||
}
|
||
}
|
||
.tabViewStyle(.sidebarAdaptable)
|
||
}
|
||
}
|