fix: Tour-Datum — Leer-Texte, veraltete Antworten, Kalenderfenster

- Leer-Ansichten (Auswählen, Sortieren, Beladen, Ausliefern) nennen den
  gewählten Tag statt immer „heute": „Für den 02.09.2026 ist keine Tour
  zugewiesen." (TourDayText).
- TourBloc: Loads/Refreshes laufen nebenläufig; bei schnellem
  Datumswechsel konnte die langsamere Antwort des vorigen Tages die Tour
  des gewählten Tages überschreiben. Jetzt schreibt nur die jüngste
  Anfrage ihr Ergebnis.
- Kalender reicht 90 statt 14 Tage zurück (z. B. nachimportierte Touren
  vom Monatsanfang).
- Test: neuer Fahrer startet auf „heute", auch wenn der vorige einen
  anderen Tag gewählt hatte.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dennis Nemec
2026-09-25 17:04:56 +02:00
parent a5215367fd
commit 2ff331294e
9 changed files with 188 additions and 19 deletions

View File

@ -72,6 +72,12 @@ class TourBloc extends Bloc<TourEvent, TourState> {
/// damit ein Pull-to-refresh denselben Tag neu lädt (nicht heute).
DateTime? _selectedDate;
/// Laufnummer der Tour-Anfragen. Loads/Refreshes laufen nebenläufig; wählt
/// der Fahrer schnell nacheinander zwei Tage, darf die langsamere Antwort
/// des ersten Tages die des zuletzt gewählten nicht überschreiben. Nur die
/// jüngste Anfrage schreibt ihr Ergebnis.
int _requestSeq = 0;
/// Räumt verwaiste Cache-Bilder weg, sobald frische Tour-Daten vorliegen.
/// Fire-and-forget — Cache-Pflege darf den Load nie verzögern oder
/// scheitern lassen.
@ -85,9 +91,11 @@ class TourBloc extends Bloc<TourEvent, TourState> {
// Nur bei explizit gesetztem Datum die Wahl aktualisieren; ein reiner
// Reload (LoadTour()) behält den aktuell angezeigten Tag.
if (event.hasDate) _selectedDate = event.date;
final seq = ++_requestSeq;
emit(const TourLoading());
try {
final details = await tourRepository.getMyTourDetails(date: _selectedDate);
if (seq != _requestSeq) return; // überholt von neuerer Anfrage
if (details == null) {
emit(const TourEmpty());
return;
@ -95,6 +103,7 @@ class TourBloc extends Bloc<TourEvent, TourState> {
emit(TourLoaded(details: details));
_pruneAttachmentCache(details);
} catch (e, st) {
if (seq != _requestSeq) return;
debugPrint('TourBloc.LoadTour fehlgeschlagen: $e\n$st');
final message = _messageOf(e, 'Tour konnte nicht geladen werden');
emit(TourLoadFailed(message: message));
@ -113,9 +122,11 @@ class TourBloc extends Bloc<TourEvent, TourState> {
return;
}
final seq = ++_requestSeq;
emit(current.copyWith(isRefreshing: true, refreshError: null));
try {
final details = await tourRepository.getMyTourDetails(date: _selectedDate);
if (seq != _requestSeq) return; // überholt von neuerer Anfrage
if (details == null) {
emit(const TourEmpty());
return;
@ -123,6 +134,7 @@ class TourBloc extends Bloc<TourEvent, TourState> {
emit(TourLoaded(details: details));
_pruneAttachmentCache(details);
} catch (e, st) {
if (seq != _requestSeq) return;
debugPrint('TourBloc.RefreshTour fehlgeschlagen: $e\n$st');
final message = _messageOf(e, 'Tour konnte nicht neu geladen werden');
// alten Stand sichtbar lassen, Fehler oben mitführen