fix: Der Offline-Start zeigt wieder den letzten Stand

AppZustand faellt beim Start ohne Verbindung auf den gemerkten Benutzer
zurueck - nur schrieb diesen Schluessel niemand je in den Zwischenspeicher.
Der Zweig konnte also nie greifen, und die App verlangte im Flugmodus eine
neue Anmeldung, obwohl die Geraetemarke laengst da war.

Gefunden beim Durchsehen fuer Stufe 2: Nur Lader und das Nachschlagewerk
schreiben in den Speicher, und auth/me geht an beiden vorbei.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-10-21 20:23:49 +02:00
co-authored by Claude Opus 5
parent a071422e23
commit 58bd504333
+25
View File
@@ -31,6 +31,12 @@ final class AppZustand {
private(set) var einstellungen = Einstellungen() private(set) var einstellungen = Einstellungen()
private(set) var client: CertainClient? private(set) var client: CertainClient?
/// Kategorien, Schlagwörter und Konten – einmal geladen, von allen
/// Listen benutzt. Jede Zeile will zu einer ID den Namen, das Symbol und
/// die Farbe; das je Ansicht neu zu holen wäre genau das N+1, das das
/// Backend sich selbst verbietet.
private(set) var nachschlag = Nachschlag.leer
/// Die letzte Meldung für den Anmeldebildschirm. Keine Fehleransicht, /// Die letzte Meldung für den Anmeldebildschirm. Keine Fehleransicht,
/// sondern eine Zeile unter dem Formular. /// sondern eine Zeile unter dem Formular.
var meldung: String? var meldung: String?
@@ -61,8 +67,12 @@ final class AppZustand {
guard let client else { return } guard let client else { return }
do { do {
let ich = try await client.ichSelbst() let ich = try await client.ichSelbst()
// Muss gemerkt werden, sonst greift der Offline-Zweig unten nie:
// Niemand sonst schreibt unter diesem Schlüssel.
Zwischenspeicher.lege(ich, unter: "auth/me")
einstellungen = (try? await client.einstellungen()) ?? Einstellungen() einstellungen = (try? await client.einstellungen()) ?? Einstellungen()
lage = .bereit(ich) lage = .bereit(ich)
await ladeNachschlag()
} catch APIFehler.nichtAngemeldet { } catch APIFehler.nichtAngemeldet {
// Marke widerrufen oder gelöscht – neu anmelden, Adresse behalten. // Marke widerrufen oder gelöscht – neu anmelden, Adresse behalten.
Ablage.marke = nil Ablage.marke = nil
@@ -77,6 +87,7 @@ final class AppZustand {
// Ansichten den letzten Stand. Die Marke ist ja da. // Ansichten den letzten Stand. Die Marke ist ja da.
if let gemerkt = Zwischenspeicher.hole(Benutzer.self, unter: "auth/me") { if let gemerkt = Zwischenspeicher.hole(Benutzer.self, unter: "auth/me") {
lage = .bereit(gemerkt.wert) lage = .bereit(gemerkt.wert)
await ladeNachschlag()
} else { } else {
meldung = error.localizedDescription meldung = error.localizedDescription
lage = .brauchtAnmeldung lage = .brauchtAnmeldung
@@ -240,6 +251,20 @@ final class AppZustand {
if let frisch = try? await client.einstellungen() { einstellungen = frisch } if let frisch = try? await client.einstellungen() { einstellungen = frisch }
} }
/// Holt das Nachschlagewerk. Geht das schief, bleibt der letzte Stand –
/// eine Buchungsliste ohne Kategorienamen wäre schlechter als eine mit
/// alten.
func ladeNachschlag() async {
guard let client else { return }
if let frisch = try? await client.nachschlag() {
Zwischenspeicher.lege(frisch, unter: "nachschlag")
nachschlag = frisch
} else if nachschlag.gruppen.isEmpty,
let gemerkt = Zwischenspeicher.hole(Nachschlag.self, unter: "nachschlag") {
nachschlag = gemerkt.wert
}
}
// MARK: - Kleinkram // MARK: - Kleinkram
/// Der Name, unter dem die Marke am Rechner auftaucht. Soll erkennbar /// Der Name, unter dem die Marke am Rechner auftaucht. Soll erkennbar