import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import '../services/app_state.dart'; import 'drive_folder_browser_screen.dart'; class SettingsScreen extends StatefulWidget { const SettingsScreen({super.key}); @override State createState() => _SettingsScreenState(); } class _SettingsScreenState extends State { bool _busy = false; String? _error; Future _connect() async { setState(() { _busy = true; _error = null; }); try { await context.read().connectDrive(); } catch (e) { setState(() => _error = 'Could not sign in: $e'); } finally { if (mounted) setState(() => _busy = false); } } Future _disconnect() async { setState(() => _busy = true); try { await context.read().disconnectDrive(); } finally { if (mounted) setState(() => _busy = false); } } void _chooseFolder() { Navigator.of(context).push( MaterialPageRoute(builder: (_) => const DriveFolderBrowserScreen()), ); } Future _syncNow() async { setState(() => _busy = true); try { await context.read().syncNow(); } finally { if (mounted) setState(() => _busy = false); } } @override Widget build(BuildContext context) { final appState = context.watch(); return Scaffold( appBar: AppBar(title: const Text('Settings')), body: ListView( padding: const EdgeInsets.all(16), children: [ Card( child: Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text('Google Drive', style: Theme.of(context).textTheme.titleMedium), const SizedBox(height: 8), if (!appState.isDriveConnected) ...[ Text( 'Connect Google Drive to share vehicles and fuel receipts with ' 'other people, and to keep a backup off this device.', style: Theme.of(context).textTheme.bodyMedium, ), const SizedBox(height: 12), if (_error != null) ...[ Text(_error!, style: TextStyle(color: Theme.of(context).colorScheme.error)), const SizedBox(height: 8), ], FilledButton.icon( onPressed: _busy ? null : _connect, icon: const Icon(Icons.login), label: const Text('Connect Google Drive'), ), ] else ...[ Text('Signed in as ${appState.driveAccountEmail}'), const SizedBox(height: 4), Text( appState.driveFolderPath == null ? 'No folder selected yet.' : 'Folder: ${appState.driveFolderPath}', style: Theme.of(context).textTheme.bodySmall, ), const SizedBox(height: 12), Wrap( spacing: 8, runSpacing: 8, children: [ OutlinedButton.icon( onPressed: _busy ? null : _chooseFolder, icon: const Icon(Icons.folder_open), label: Text(appState.driveFolderPath == null ? 'Choose Folder' : 'Change Folder'), ), OutlinedButton.icon( onPressed: (_busy || appState.driveFolderPath == null) ? null : _syncNow, icon: appState.isSyncing ? const SizedBox( height: 16, width: 16, child: CircularProgressIndicator(strokeWidth: 2)) : const Icon(Icons.sync), label: const Text('Sync Now'), ), TextButton.icon( onPressed: _busy ? null : _disconnect, icon: const Icon(Icons.logout), label: const Text('Disconnect'), ), ], ), const SizedBox(height: 8), if (appState.lastSyncedAt != null) Text( 'Last synced ${DateFormat.yMMMd().add_jm().format(appState.lastSyncedAt!)}', style: Theme.of(context).textTheme.bodySmall, ), if (appState.lastSyncError != null) Padding( padding: const EdgeInsets.only(top: 4), child: Text( 'Last sync failed: ${appState.lastSyncError}', style: TextStyle(color: Theme.of(context).colorScheme.error), ), ), ], ], ), ), ), const SizedBox(height: 16), Card( child: Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text('Summary', style: Theme.of(context).textTheme.titleMedium), const SizedBox(height: 8), Text('${appState.vehicles.length} vehicle(s)'), Text('${appState.fuelEntries.length} fuel entries'), Text('${appState.totalGallonsAllVehicles.toStringAsFixed(3)} total gallons logged'), ], ), ), ), ], ), ); } }