fix(tours): Reload/Neustart behaelt gewaehltes Datum (kein Sprung auf heute)

Der Header-Kalender zeigte nach Neustart/Retry noch 'morgen', geladen wurde
aber 'heute' (leer). Ursache: Initial-Load und diverse Retry-Buttons
dispatchten LoadTour() ohne Datum -> immer heute.

- LoadTour(): reiner Reload, behaelt das gemerkte Datum
- LoadTour.forDate(date): setzt gezielt ein Datum (Kalender + Initial-Load)
- Initial-Load in home.dart liest das Datum aus dem TourDateCubit
- Retry-Buttons (Fail-/Sort-/Loading-Seite) laden dadurch den angezeigten Tag

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dennis Nemec
2026-09-01 16:06:58 +02:00
parent 83d52364a5
commit 633b7631aa
4 changed files with 35 additions and 12 deletions

View File

@ -80,7 +80,9 @@ class TourBloc extends Bloc<TourEvent, TourState> {
// ─── LoadTour ────────────────────────────────────────────────────────
Future<void> _onLoad(LoadTour event, Emitter<TourState> emit) async {
_selectedDate = event.date;
// Nur bei explizit gesetztem Datum die Wahl aktualisieren; ein reiner
// Reload (LoadTour()) behält den aktuell angezeigten Tag.
if (event.hasDate) _selectedDate = event.date;
emit(const TourLoading());
try {
final details = await tourRepository.getMyTourDetails(date: _selectedDate);
@ -103,9 +105,9 @@ class TourBloc extends Bloc<TourEvent, TourState> {
Future<void> _onRefresh(RefreshTour event, Emitter<TourState> emit) async {
final current = state;
if (current is! TourLoaded) {
// Keine sichtbare Tour zum „weichen" Refreshen — wie ein LoadTour
// behandeln. Das aktuell gewählte Datum beibehalten.
await _onLoad(LoadTour(date: _selectedDate), emit);
// Keine sichtbare Tour zum „weichen" Refreshen — wie ein Reload
// behandeln. `const LoadTour()` behält das aktuell gewählte Datum.
await _onLoad(const LoadTour(), emit);
return;
}

View File

@ -7,16 +7,28 @@ sealed class TourEvent {
const TourEvent();
}
/// Initial-Load bzw. Laden der Tour des angemeldeten Fahrers für ein
/// bestimmtes Datum. Account-Filter sitzt im JWT.
/// Lädt die Tour des angemeldeten Fahrers. Account-Filter sitzt im JWT.
///
/// [date] `null` = „heute" (Server entscheidet). Wählt der Fahrer im
/// Kopf-Kalender ein Datum, wird es hier übergeben und der Bloc merkt es
/// sich für nachfolgende [RefreshTour]-Events.
/// Zwei Spielarten:
/// * [LoadTour] (ohne Datum): **Reload/Retry** — lädt den aktuell im Bloc
/// gemerkten Tag erneut und ändert die Datumswahl NICHT. Für Retry-Buttons
/// und Fehler-Seiten, die sonst versehentlich auf „heute" zurückspringen.
/// * [LoadTour.forDate]: setzt gezielt ein Datum (`null` = heute) und merkt
/// es sich als aktuelles Datum für nachfolgende Reloads/Refreshes. Für den
/// Kopf-Kalender und den Initial-Load (aus dem [TourDateCubit]).
class LoadTour extends TourEvent {
const LoadTour({this.date});
const LoadTour()
: date = null,
hasDate = false;
const LoadTour.forDate(this.date) : hasDate = true;
/// Ziel-Datum, nur relevant wenn [hasDate] `true` ist. `null` = heute.
final DateTime? date;
/// `true` = [date] wurde bewusst gesetzt; `false` = „aktuelles Datum
/// behalten" (reiner Reload).
final bool hasDate;
}
/// Pull-to-refresh / manueller Reload aus der Übersicht. Vorhandener