feat(header): Datumswahl im Kopf statt Fahrzeug-Pille

Neue Kalender-Pille im Phase-Stepper: zeigt das Tour-Datum und oeffnet einen
Datepicker, um die Tour eines anderen Tages zu laden (z. B. morgen vorab).
Fahrzeugwechsel bleibt ueber den Drawer erreichbar.

- TourDateCubit haelt das gewaehlte Datum (null = heute, Server autoritativ)
- LoadTour({date}) + TourBloc merkt das Datum (RefreshTour laedt denselben Tag)
- Repository getMyTourDetails({date}) -> API listMyTours(date:) -> GET /me/tours?date=

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dennis Nemec
2026-09-01 15:42:44 +02:00
parent 7324aa4e7d
commit 7b7cb4eb63
8 changed files with 204 additions and 79 deletions

View File

@ -65,6 +65,11 @@ class TourBloc extends Bloc<TourEvent, TourState> {
final Uuid _uuid = const Uuid();
/// Aktuell angefragtes Tour-Datum. `null` = „heute" (Server entscheidet).
/// Wird vom [LoadTour]-Event gesetzt und von [RefreshTour] wiederverwendet,
/// damit ein Pull-to-refresh denselben Tag neu lädt (nicht heute).
DateTime? _selectedDate;
/// 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.
@ -75,9 +80,10 @@ class TourBloc extends Bloc<TourEvent, TourState> {
// ─── LoadTour ────────────────────────────────────────────────────────
Future<void> _onLoad(LoadTour event, Emitter<TourState> emit) async {
_selectedDate = event.date;
emit(const TourLoading());
try {
final details = await tourRepository.getMyTourDetailsOfToday();
final details = await tourRepository.getMyTourDetails(date: _selectedDate);
if (details == null) {
emit(const TourEmpty());
return;
@ -98,14 +104,14 @@ class TourBloc extends Bloc<TourEvent, TourState> {
final current = state;
if (current is! TourLoaded) {
// Keine sichtbare Tour zum „weichen" Refreshen — wie ein LoadTour
// behandeln.
await _onLoad(const LoadTour(), emit);
// behandeln. Das aktuell gewählte Datum beibehalten.
await _onLoad(LoadTour(date: _selectedDate), emit);
return;
}
emit(current.copyWith(isRefreshing: true, refreshError: null));
try {
final details = await tourRepository.getMyTourDetailsOfToday();
final details = await tourRepository.getMyTourDetails(date: _selectedDate);
if (details == null) {
emit(const TourEmpty());
return;