import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:hl_lieferservice/bloc/app_bloc.dart'; import 'package:hl_lieferservice/feature/authentication/bloc/auth_bloc.dart'; import 'package:hl_lieferservice/feature/authentication/presentation/login_enforcer.dart'; import 'package:hl_lieferservice/feature/authentication/service/userinfo.dart'; import 'package:hl_lieferservice/feature/car_selection/bloc/bloc.dart'; import 'package:hl_lieferservice/feature/car_selection/presentation/car_selection_enforcer.dart'; import 'package:hl_lieferservice/feature/car_selection/repository/car_selection_repository.dart'; import 'package:hl_lieferservice/feature/cars/bloc/cars_bloc.dart'; import 'package:hl_lieferservice/feature/cars/presentation/car_management_page.dart'; import 'package:hl_lieferservice/feature/cars/repository/cars_repository.dart'; import 'package:hl_lieferservice/feature/cars/service/cars_service.dart'; import 'package:hl_lieferservice/feature/delivery/bloc/tour_bloc.dart'; import 'package:hl_lieferservice/feature/delivery/repository/tour_repository.dart'; import 'package:hl_lieferservice/widget/home/bloc/navigation_bloc.dart'; import 'package:hl_lieferservice/widget/operations/bloc/operation_bloc.dart'; import 'package:hl_lieferservice/widget/operations/presentation/operation_view_enforcer.dart'; import 'package:hl_lieferservice/bloc/app_states.dart'; import '../feature/delivery/service/tour_service.dart'; import 'home/presentation/home.dart'; class DeliveryApp extends StatefulWidget { const DeliveryApp({super.key}); @override State createState() => _DeliveryAppState(); } class _DeliveryAppState extends State { @override Widget build(BuildContext context) { return BlocBuilder( builder: (context, state) { if (state is AppConfigLoaded) { final currentAppState = state; return MultiBlocProvider( providers: [ BlocProvider(create: (context) => NavigationBloc()), BlocProvider(create: (context) => OperationBloc()), BlocProvider( create: (context) => AuthBloc( service: UserInfoService( url: currentAppState.config.backendUrl, ), operationBloc: context.read(), ), ), BlocProvider( create: (context) => TourBloc( opBloc: context.read(), authBloc: context.read(), tourRepository: TourRepository( service: TourService(), ), ), ), BlocProvider( create: (context) => CarSelectBloc(repository: CarSelectionRepository()), ), BlocProvider( create: (context) => CarsBloc( repository: CarsRepository(service: CarService()), opBloc: context.read(), authBloc: context.read(), ), ), ], child: MaterialApp( // Wrap the Navigator (not just the home route) so the loading // overlay covers every pushed route — DeliveryDetail, Cars, // dialogs, etc. — not only the initial home tree. builder: (context, child) => OperationViewEnforcer(child: child ?? const SizedBox.shrink()), home: BlocBuilder( builder: (context, state) { if (state is AppConfigLoading) { return Scaffold( body: Center(child: CircularProgressIndicator()), ); } if (state is AppConfigLoadingFailed) { return Scaffold(body: Center(child: Text(state.message))); } if (state is AppConfigLoaded) { return LoginEnforcer( child: CarSelectionEnforcer(child: Home()), ); } return Container(); }, ), routes: {"/cars": (context) => CarManagementPage()}, ), ); } if (state is AppConfigLoadingFailed) { return MaterialApp( home: Scaffold( body: Center(child: Text("Fehler beim Laden der Konfiguration")), ), ); } return MaterialApp( home: Scaffold( body: Center(child: const CircularProgressIndicator()), ), ); }, ); } }