import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../models/vehicle.dart'; import '../services/app_state.dart'; import 'add_edit_vehicle_screen.dart'; import 'settings_screen.dart'; import 'vehicle_detail_screen.dart'; class HomeScreen extends StatelessWidget { const HomeScreen({super.key}); @override Widget build(BuildContext context) { final appState = context.watch(); final vehicles = appState.vehicles; return Scaffold( appBar: AppBar( title: const Text('My Vehicles'), actions: [ IconButton( icon: const Icon(Icons.settings_outlined), tooltip: 'Settings', onPressed: () => Navigator.of(context).push( MaterialPageRoute(builder: (_) => const SettingsScreen()), ), ), ], ), body: vehicles.isEmpty ? const _EmptyState() : ListView.separated( padding: const EdgeInsets.all(12), itemCount: vehicles.length, separatorBuilder: (_, _) => const SizedBox(height: 8), itemBuilder: (context, index) { final vehicle = vehicles[index]; final gallons = appState.totalGallonsForVehicle(vehicle.id); return _VehicleCard(vehicle: vehicle, totalGallons: gallons); }, ), floatingActionButton: FloatingActionButton.extended( onPressed: () => Navigator.of(context).push( MaterialPageRoute(builder: (_) => const AddEditVehicleScreen()), ), icon: const Icon(Icons.add), label: const Text('Add Vehicle'), ), ); } } class _VehicleCard extends StatelessWidget { final Vehicle vehicle; final double totalGallons; const _VehicleCard({required this.vehicle, required this.totalGallons}); @override Widget build(BuildContext context) { final hasNickname = vehicle.nickname?.trim().isNotEmpty ?? false; final gallonsLine = '${totalGallons.toStringAsFixed(3)} gallons logged'; return Card( clipBehavior: Clip.antiAlias, child: ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), leading: const CircleAvatar(child: Icon(Icons.directions_car_outlined)), title: Text(vehicle.displayLabel), // Only repeat the VIN here when the title is already showing the // nickname instead — otherwise the title (falling back to the VIN // when there's no nickname) would show it twice. subtitle: Text(hasNickname ? 'VIN: ${vehicle.vin}\n$gallonsLine' : gallonsLine), isThreeLine: hasNickname, trailing: const Icon(Icons.chevron_right), onTap: () => Navigator.of(context).push( MaterialPageRoute(builder: (_) => VehicleDetailScreen(vehicleId: vehicle.id)), ), ), ); } } class _EmptyState extends StatelessWidget { const _EmptyState(); @override Widget build(BuildContext context) { return Center( child: Padding( padding: const EdgeInsets.all(32), child: Column( mainAxisSize: MainAxisSize.min, children: [ Icon(Icons.local_shipping_outlined, size: 64, color: Theme.of(context).colorScheme.outline), const SizedBox(height: 16), Text( 'No vehicles yet. Add a vehicle to start logging fuel receipts.', textAlign: TextAlign.center, style: Theme.of(context).textTheme.bodyLarge, ), ], ), ), ); } }