import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../models/delivery.dart'; import '../models/delivery_route.dart'; import '../providers/providers.dart'; import '../utils/breakpoints.dart'; import '../components/collapsible_routes_sidebar.dart'; import '../components/dark_mode_map.dart'; import '../services/location_permission_service.dart'; import 'deliveries_page.dart'; import 'settings_page.dart'; class RoutesPage extends ConsumerStatefulWidget { const RoutesPage({super.key}); @override ConsumerState createState() => _RoutesPageState(); } class _RoutesPageState extends ConsumerState { late LocationPermissionService _permissionService; DeliveryRoute? _selectedRoute; Delivery? _selectedDelivery; @override void initState() { super.initState(); _permissionService = LocationPermissionService(); _requestLocationPermissionOnce(); } Future _requestLocationPermissionOnce() async { try { final hasPermission = await _permissionService.hasLocationPermission(); if (!hasPermission && mounted) { final result = await _permissionService.requestLocationPermission(); result.when( granted: () { debugPrint('Location permission granted'); }, denied: () { debugPrint('Location permission denied'); }, permanentlyDenied: () { debugPrint('Location permission permanently denied'); }, error: (message) { debugPrint('Location permission error: $message'); }, ); } } catch (e) { debugPrint('Error requesting location permission: $e'); } } void _selectRoute(DeliveryRoute route) { setState(() { _selectedRoute = route; }); } void _backToRoutes() { setState(() { _selectedRoute = null; _selectedDelivery = null; }); } @override Widget build(BuildContext context) { final routesData = ref.watch(deliveryRoutesProvider); final allDeliveriesData = ref.watch(allDeliveriesProvider); final userProfile = ref.watch(userProfileProvider); return Scaffold( appBar: AppBar( title: const Text('Delivery Routes'), elevation: 0, actions: [ IconButton( icon: const Icon(Icons.refresh), onPressed: () { ref.refresh(deliveryRoutesProvider); ref.refresh(allDeliveriesProvider); }, tooltip: 'Refresh', ), userProfile.when( data: (profile) => PopupMenuButton( onSelected: (value) { if (value == 'settings') { Navigator.of(context).push( MaterialPageRoute( builder: (context) => const SettingsPage(), ), ); } }, itemBuilder: (BuildContext context) => [ PopupMenuItem( value: 'profile', child: Text(profile?.fullName ?? 'User'), enabled: false, ), const PopupMenuDivider(), const PopupMenuItem( value: 'settings', child: Text('Settings'), ), ], child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0), child: Center( child: Text( profile?.fullName ?? 'User', style: Theme.of(context).textTheme.titleSmall, ), ), ), ), loading: () => const Padding( padding: EdgeInsets.all(16.0), child: SizedBox( width: 16, height: 16, child: CircularProgressIndicator(strokeWidth: 2), ), ), error: (error, stackTrace) => const SizedBox(), ), ], ), body: routesData.when( data: (routes) { if (routes.isEmpty) { return const Center( child: Text('No routes available'), ); } return allDeliveriesData.when( data: (allDeliveries) { return RefreshIndicator( onRefresh: () async { // ignore: unused_result ref.refresh(deliveryRoutesProvider); // ignore: unused_result ref.refresh(allDeliveriesProvider); }, child: Row( children: [ Expanded( child: DarkModeMapComponent( deliveries: allDeliveries, selectedDelivery: _selectedDelivery, onDeliverySelected: (delivery) { setState(() { _selectedDelivery = delivery; }); }, ), ), _selectedRoute == null ? CollapsibleRoutesSidebar( routes: routes, selectedRoute: null, onRouteSelected: _selectRoute, ) : SizedBox( width: 300, child: DeliveriesPage( routeFragmentId: _selectedRoute!.id, routeName: _selectedRoute!.name, onBack: _backToRoutes, showAsEmbedded: true, onDeliverySelected: (delivery) { setState(() { _selectedDelivery = delivery; }); }, ), ), ], ), ); }, loading: () => const Center( child: CircularProgressIndicator(), ), error: (error, stackTrace) => Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('Error loading deliveries: $error'), const SizedBox(height: 16), ElevatedButton( onPressed: () => ref.refresh(allDeliveriesProvider), child: const Text('Retry'), ), ], ), ), ); }, loading: () => const Center( child: CircularProgressIndicator(), ), error: (error, stackTrace) => Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('Error: $error'), const SizedBox(height: 16), ElevatedButton( onPressed: () => ref.refresh(deliveryRoutesProvider), child: const Text('Retry'), ), ], ), ), ), ); } }