import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:mileograph_flutter/components/calculator/route_summary_widget.dart'; import 'package:mileograph_flutter/objects/objects.dart'; import 'package:mileograph_flutter/services/distance_unit_service.dart'; import 'package:provider/provider.dart'; class CalculatorDetailsPage extends StatelessWidget { const CalculatorDetailsPage({ super.key, required this.result, }); final Object? result; @override Widget build(BuildContext context) { final parsed = result is RouteResult ? result as RouteResult : null; if (parsed == null) { return Padding( padding: const EdgeInsets.all(16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ TextButton.icon( onPressed: () => context.pop(), icon: const Icon(Icons.arrow_back), label: const Text('Back'), ), const SizedBox(height: 12), const Text( 'No route details available.', ), ], ), ); } final networks = List.from(parsed.networkMileage) ..sort((a, b) => b.miles.compareTo(a.miles)); final countries = List.from(parsed.countryMileage) ..sort((a, b) => b.miles.compareTo(a.miles)); return Scaffold( endDrawer: _NetworksDrawer( networks: networks, countries: countries, ), body: Builder( builder: (scaffoldContext) => Padding( padding: const EdgeInsets.all(16.0), child: RouteDetailsView( route: parsed.calculatedRoute, costs: parsed.costs, routingPoints: parsed.inputRoute.toSet(), onBack: () => context.pop(), onNetworksPressed: () => Scaffold.of(scaffoldContext).openEndDrawer(), ), ), ), ); } } class _NetworksDrawer extends StatelessWidget { const _NetworksDrawer({ required this.networks, required this.countries, }); final List networks; final List countries; @override Widget build(BuildContext context) { final distanceUnits = context.watch(); return Drawer( child: SafeArea( child: ListView( padding: const EdgeInsets.all(16), children: [ Text( 'Networks', style: Theme.of(context).textTheme.titleMedium, ), const SizedBox(height: 8), if (networks.isEmpty) const Text('No network mileage data.') else ...networks.map( (entry) => ListTile( contentPadding: EdgeInsets.zero, title: Text(entry.network), trailing: Text(distanceUnits.format(entry.miles, decimals: 2)), ), ), const SizedBox(height: 16), Text( 'Countries', style: Theme.of(context).textTheme.titleMedium, ), const SizedBox(height: 8), if (countries.isEmpty) const Text('No country mileage data.') else ...countries.map( (entry) => ListTile( contentPadding: EdgeInsets.zero, title: Text(entry.country), trailing: Text(distanceUnits.format(entry.miles, decimals: 2)), ), ), ], ), ), ); } }