Frontend: Abstuerze, stiller Datenverlust und unerreichbare Features beheben #59
No reviewers
Labels
No labels
bug
critical
database
duplicate
enhancement
help wanted
invalid
performance
question
refactoring
security
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Aceless/RecipePlanner!59
Loading…
Reference in a new issue
No description provided.
Delete branch "frontend-improvements"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Behebt die Frontend-Issues #1 bis #29 und #31 aus dem Review. #30 bleibt offen: die Unit-Tests sind da, Widget-Tests und CI fehlen noch.
Nur
app/ist angefasst. Im Working Tree lagen parallel fremde Backend-Änderungen, die bewusst nicht Teil dieses Branches sind.Absturz und Datenverlust
runApp()gegen zwei Requests ohne Timeout. Bei nicht erreichbarem Server blieb die App minutenlang auf dem Splash. Sie läuft jetzt überappUpdateProvidernach dem ersten Frame und fängt Fehler selbst ab.int.parseauf drei Freitextfelder warf bei1,5eineFormatException. Jetzt Ziffernfilter, numerischer Validator undtryParse.addRecipewurde nicht awaited, der Screen schloss sofort, Serverfehler gingen als unbehandelte Async-Exception verloren. Jetzt awaited, mit Fehlermeldung, gepoppt nur bei Erfolg.copyWithhießnull"nicht ändern". Neuerunset-Sentinel inlib/util/copy_with.dart, angewandt aufRecipeState,MealPlanState,SpacesStateundAuthState.isoWeekNumberrechnet jetzt in UTC über den Donnerstag der Woche.RangeErrorbei leerem Rezepttitel (#24) und fehlendescatchim Vorschläge-Screen.Zwei fertige Features waren unerreichbar
SettingsScreen(#11) wurde nirgends navigiert. Damit war die gesamte Bring!-Konfiguration nicht bedienbar, obwohl die Detailseite einen "Zu Bring! senden"-Button hat. Jetzt über ein Icon im Wochenplan-Header erreichbar.SharedLinkImportHandler(#12) wurde nie instanziiert. Der Router liefert jetztrootNavigatorKey,main()startet den Handler.Entfernt:
weekly_plan_screen.dart,modern_input_field.dart,migration_helper.dart, jeweils ohne Referenz.Sicherheit
flutter_secure_storagenutzt. Sie liegen jetzt ebenfalls dort, Altbestand wird beim ersten Lesen migriert und in der DB gelöscht. Gespeichert wird beionEditingCompletestatt bei jedem Tastendruck.ApiException.toString()zeigte den kompletten Response-Body. Jetzt werden Meldungen aus ProblemDetails extrahiert, sonst statuscode-abhängige Texte; der Rohtext geht nur ins Log.baseUrlkommt aus--dart-define=API_BASE_URL, jeder Request hat 10 Sekunden Timeout.Zustand und Fehlerbehandlung
debugPrint, in Release-Builds also gar nicht.RecipeStateundMealPlanStatehaben einerror-Feld, das neueErrorBannerzeigt es mit Wiederholen-Knopf. Die Notifier werfen bei Schreibfehlern weiter.startOfWeek,dayIndexInWeekundweekStartDayNameals gemeinsame Helfer insettings_service.dart.awaiterfassten State.buildneu erzeugt. Sie liegen jetzt im State, werden mit der Zeile entfernt und freigegeben. Login, Register und alle Dialoge räumen ebenfalls auf.Darstellung
ColorScheme.fromSeed.MealColorsundDifficultyColorsalsThemeExtension.Colors.grey/red/blue/green/orange/indigokommen inlib/nicht mehr vor.BorderSide.noneauch fürfocusedBorderundfocusedErrorBorder.\uXXXX-Escapes sind durch echte Zeichen ersetzt.onMealTapspringt zur passenden Mahlzeit.Wrap, die drei Zahlenfelder stapeln unter 360 dp.intl(#29), Version auspackage_info_plus(#31).Nachweis
flutter analyzeflutter testtest/Neu hinzugefügte Dependency:
url_launcherfür den Update-Link.Die Tests deckten gezielt die Stellen ab, an denen Fehler gefunden wurden:
isoWeekNumberüber Jahreswechsel und Sommerzeit,startOfWeekunddayIndexInWeekfür beide Wochenstarts, sowie diecopyWith-Sentinel-Logik.🤖 Generated with Claude Code
https://claude.ai/code/session_01YSTprHbQnuPxu5GeStnCnB
47edeeb9d8tof628f68a5aHinweis zur Merge-Reihenfolge
Der Branch
backend/issue-fixeswurde vonfrontend-improvementsabgezweigt und enthaelt deshalb die sieben Frontend-Commits dieses PRs mit.Dieser Branch wurde danach umgeschrieben und force-gepusht: ein Commit hatte drei Backend-Dateien mitgeloescht, die nicht in diesen PR gehoeren (
backend/.envund beideappsettings*.json). Sie sind wieder enthalten, der PR umfasst jetzt ausschliesslichapp/. Die Commit-Hashes haben sich dadurch geaendert.Fuer den Merge bedeutet das:
backend/issue-fixestraegt noch die alten Hashes der Frontend-Commits. Werden beide Branches gemergt, landen diese Aenderungen inhaltlich doppelt in der Historie. Sauberer ist,backend/issue-fixesvor dem Merge aufmainzu rebasen, damit dort nur die Backend-Commits liegen.Unabhaengig von diesem PR: der OpenAI-Key in
backend/.env, das JWT-Secret und das DB-Passwort inappsettings.Development.jsonliegen in der Historie vonmain. Sie muessen rotiert werden, ein spaeteres Loeschen der Dateien genuegt nicht. Siehe #32 und #35.