feat: Erste Stufe der iOS-App - Anmeldung und Kontenliste
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>
This commit is contained in:
co-authored by
Claude Opus 5
parent
8a7545bf5b
commit
6b86a6bf91
@@ -0,0 +1,53 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user