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

@ -24,9 +24,10 @@ class TourRepositoryImpl implements TourRepository {
final api.HolzleitnerApi _api;
@override
Future<TourSummary?> getMyTourSummaryOfToday() async {
Future<TourSummary?> getMyTourSummary({DateTime? date}) async {
try {
final response = await _api.getToursApi().listMyToursToday();
final response =
await _api.getToursApi().listMyTours(date: _formatDate(date));
final tours = response.data?.tours;
if (tours == null || tours.isEmpty) return null;
// Backend liefert die Liste sortiert; wir nehmen die erste Tour.
@ -38,6 +39,16 @@ class TourRepositoryImpl implements TourRepository {
}
}
/// Formatiert das Datum als `YYYY-MM-DD` für den `?date=`-Query. `null`
/// bleibt `null` → der Server nimmt „heute".
static String? _formatDate(DateTime? date) {
if (date == null) return null;
final y = date.year.toString().padLeft(4, '0');
final m = date.month.toString().padLeft(2, '0');
final d = date.day.toString().padLeft(2, '0');
return '$y-$m-$d';
}
@override
Future<TourDetails> getTourDetails(String tourId) async {
try {
@ -55,8 +66,8 @@ class TourRepositoryImpl implements TourRepository {
}
@override
Future<TourDetails?> getMyTourDetailsOfToday() async {
final summary = await getMyTourSummaryOfToday();
Future<TourDetails?> getMyTourDetails({DateTime? date}) async {
final summary = await getMyTourSummary(date: date);
if (summary == null) return null;
return getTourDetails(summary.tourId);
}