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:
@ -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;
|
||||
|
||||
22
lib/feature/delivery/bloc/tour_date_cubit.dart
Normal file
22
lib/feature/delivery/bloc/tour_date_cubit.dart
Normal file
@ -0,0 +1,22 @@
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
|
||||
/// Hält das im Kopf-Kalender aktiv gewählte Tour-Datum.
|
||||
///
|
||||
/// State `null` bedeutet **„heute"** — und zwar autoritativ vom Server
|
||||
/// entschieden (die App-Uhr ist nicht vertrauenswürdig; siehe Backend
|
||||
/// `ListMyToursTodayUseCase`). Erst wenn der Fahrer im Header bewusst ein
|
||||
/// Datum wählt, trägt der Cubit ein konkretes Datum.
|
||||
///
|
||||
/// Bewusst getrennt vom `TourBloc`: das gewählte Datum muss auch dann bekannt
|
||||
/// sein, wenn für den Tag gar keine Tour existiert (`TourEmpty` trägt kein
|
||||
/// `tour.date`), damit der Header trotzdem das richtige Datum anzeigt.
|
||||
class TourDateCubit extends Cubit<DateTime?> {
|
||||
TourDateCubit() : super(null);
|
||||
|
||||
/// Wählt ein konkretes Datum. Nur die Tageskomponente zählt — Uhrzeit wird
|
||||
/// verworfen, damit Vergleiche/Anzeige stabil bleiben.
|
||||
void pick(DateTime date) => emit(DateTime(date.year, date.month, date.day));
|
||||
|
||||
/// Zurück auf „heute" (Server-Default).
|
||||
void reset() => emit(null);
|
||||
}
|
||||
@ -7,10 +7,16 @@ sealed class TourEvent {
|
||||
const TourEvent();
|
||||
}
|
||||
|
||||
/// Initial-Load der heutigen Tour des angemeldeten Fahrers.
|
||||
/// Account-Filter sitzt im JWT — kein zusätzliches Argument nötig.
|
||||
/// Initial-Load bzw. Laden der Tour des angemeldeten Fahrers für ein
|
||||
/// bestimmtes Datum. 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.
|
||||
class LoadTour extends TourEvent {
|
||||
const LoadTour();
|
||||
const LoadTour({this.date});
|
||||
|
||||
final DateTime? date;
|
||||
}
|
||||
|
||||
/// Pull-to-refresh / manueller Reload aus der Übersicht. Vorhandener
|
||||
|
||||
Reference in New Issue
Block a user