import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:hl_lieferservice/feature/authentication/bloc/auth_bloc.dart'; import 'package:hl_lieferservice/feature/authentication/bloc/auth_state.dart'; import 'package:hl_lieferservice/feature/car_selection/bloc/bloc.dart'; import 'package:hl_lieferservice/feature/car_selection/bloc/state.dart'; import 'package:hl_lieferservice/feature/car_selection/presentation/selected_car_bar.dart'; import 'package:hl_lieferservice/feature/cars/presentation/car_management_page.dart'; import 'package:hl_lieferservice/feature/delivery/bloc/phase_bloc.dart'; import 'package:hl_lieferservice/feature/delivery/bloc/phase_event.dart'; import 'package:hl_lieferservice/feature/delivery/bloc/phase_state.dart'; import 'package:hl_lieferservice/feature/delivery/bloc/tour_bloc.dart'; import 'package:hl_lieferservice/feature/delivery/bloc/tour_event.dart'; import 'package:hl_lieferservice/feature/delivery/bloc/tour_state.dart'; import 'package:hl_lieferservice/feature/delivery/model/delivery_phase.dart'; import 'package:hl_lieferservice/feature/delivery/overview/presentation/delivery_overview_page.dart'; import 'package:hl_lieferservice/feature/delivery/overview/presentation/delivery_selection_page.dart'; import 'package:hl_lieferservice/feature/delivery/overview/presentation/delivery_sort_page.dart'; import 'package:hl_lieferservice/feature/loading/presentation/loading_overview_page.dart'; import 'package:hl_lieferservice/feature/settings/presentation/settings_page.dart'; import 'package:hl_lieferservice/widget/home/bloc/navigation_bloc.dart'; import 'package:hl_lieferservice/widget/home/bloc/navigation_state.dart'; import 'package:hl_lieferservice/widget/navigation_bar/presentation/navigation_bar.dart'; /// Wurzel-Widget des authentifizierten Bereichs. Routet anhand der aktuellen /// Phase des ausgewählten Fahrzeugs: /// /// * Phase Sortieren / Beladen → die jeweilige Phase-Page wird direkt /// gerendert (kein BottomNav). Navigation läuft über den Phasen-Stepper. /// * Phase Ausliefern → klassisches Home mit BottomNavigationBar /// (Auslieferung / Fahrzeuge / Einstellungen). Beladung als Tab entfällt, /// da die Phase abgeschlossen ist. class Home extends StatefulWidget { const Home({super.key}); @override State createState() => _HomeState(); } class _HomeState extends State { String? _initializedCarId; @override void initState() { super.initState(); // Tour beim ersten Aufbau laden. final authState = context.read().state as Authenticated; context.read().add(LoadTour(teamId: authState.user.number)); } /// Stellt sicher, dass für das aktuell gewählte Auto eine Phase im /// [PhaseBloc] existiert. Wird im build() reaktiv aufgerufen, daher mit /// `_initializedCarId` gegen mehrfache Loads gesichert. /// /// Wichtig: Wir feuern den Load erst, sobald die Tour geladen ist — /// sonst kennt der PhaseBloc die Anzahl der Team-Fahrzeuge nicht und /// würde fälschlich mit `sortieren` einsteigen, statt mit `auswaehlen`. void _ensurePhaseLoaded(String carId) { if (_initializedCarId == carId) return; _initializedCarId = carId; context.read().add(PhaseLoadForCar(carId: carId)); } @override Widget build(BuildContext context) { return BlocBuilder( builder: (context, carState) { // Ohne ausgewähltes Auto bleibt Home leer — der CarSelectionEnforcer // legt die Selection-Page als Overlay darüber. if (carState is! CarSelectComplete) { return const Scaffold(body: SizedBox.shrink()); } final carId = carState.selectedCar.id.toString(); return BlocBuilder( // Tour-Status mitnehmen, weil die Eintrittsphase davon abhängt. // Nur bei TourLoaded triggern wir den Phasen-Load. builder: (context, tourState) { if (tourState is TourLoaded) { _ensurePhaseLoaded(carId); } return BlocBuilder( builder: (context, phaseState) { final phase = phaseState is PhaseReady ? phaseState.phaseFor(carId) : null; // Solange weder Tour noch Phase geladen sind, kurzen Spinner // zeigen — das dauert in der Praxis maximal einen Frame. if (phase == null) { return const Scaffold( body: Center(child: CircularProgressIndicator()), ); } return _buildForPhase(context, phase, carState.selectedCar.id); }, ); }, ); }, ); } Widget _buildForPhase( BuildContext context, DeliveryPhase phase, String selectedCarId, ) { switch (phase) { case DeliveryPhase.auswaehlen: // Auswahl-Page nur sichtbar bei Teams mit ≥2 Fahrzeugen — der // PhaseBloc setzt diese Phase nicht für Ein-Auto-Teams. return DeliverySelectionPage(selectedCarId: selectedCarId); case DeliveryPhase.sortieren: // Sort-Page baut eigenen Scaffold inkl. Stepper-Header. return DeliverySortPage(selectedCarId: selectedCarId); case DeliveryPhase.beladen: // Beladen-Phase: Einstieg über die Übersicht. Der Fahrer wählt selbst // aus, mit welchem Kunden er starten möchte — das Kunden-Vollbild // wird per Tap auf eine Karte geöffnet (siehe LoadingOverviewPage). return const LoadingOverviewPage(); case DeliveryPhase.ausliefern: return const _DeliveryHome(); } } } /// Klassisches Home für die Auslieferungs-Phase: BottomNavigationBar mit /// drei Tabs (Auslieferung / Fahrzeuge / Einstellungen). Die Beladung als /// Tab entfällt bewusst — wer in dieser Phase zurück zur Beladung möchte, /// nutzt den Phasen-Stepper auf den jeweiligen Pages oder den Drawer. class _DeliveryHome extends StatelessWidget { const _DeliveryHome(); Widget _buildPage(int index) { switch (index) { case 0: return const DeliveryOverviewPage(); case 1: return const CarManagementPage(); case 2: return const SettingsPage(); default: return const SizedBox.shrink(); } } @override Widget build(BuildContext context) { return BlocBuilder( builder: (context, state) { final navIndex = state is NavigationInfo ? state.navigationIndex : 0; // Bei einem Tab-Index, der außerhalb des neuen Bereichs liegt // (z. B. vom alten 4-Tab-Layout: 0..3), normieren wir defensiv auf 0. final safeIndex = (navIndex >= 0 && navIndex <= 2) ? navIndex : 0; return Scaffold( body: _buildPage(safeIndex), bottomNavigationBar: Column( mainAxisSize: MainAxisSize.min, children: const [ SelectedCarBar(), AppNavigationBar(), ], ), ); }, ); } }