import 'package:flutter/material.dart'; import '../main.dart'; import '../theme/app_colors.dart'; import 'about_screen.dart'; import 'my_reports_screen.dart'; /// Profile / settings tab. class ProfileScreen extends StatelessWidget { const ProfileScreen({super.key}); @override Widget build(BuildContext context) { final user = supabase.auth.currentUser; final email = user?.email ?? 'unknown'; final createdAt = user?.createdAt; final theme = Theme.of(context); return Scaffold( body: CustomScrollView( slivers: [ // ── Header ── SliverAppBar( expandedHeight: 200, pinned: true, flexibleSpace: FlexibleSpaceBar( background: Stack( fit: StackFit.expand, children: [ Image.asset( 'assets/img/login_bg.jpg', fit: BoxFit.cover, ), Container( decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ Colors.black.withValues(alpha: 0.3), Colors.black.withValues(alpha: 0.55), ], ), ), ), SafeArea( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const SizedBox(height: 16), // Avatar Container( width: 80, height: 80, decoration: BoxDecoration( shape: BoxShape.circle, border: Border.all(color: Colors.white, width: 3), color: Colors.white.withValues(alpha: 0.2), ), child: const Icon( Icons.person, size: 44, color: Colors.white, ), ), const SizedBox(height: 12), Text( email, style: TextStyle( fontSize: 16, fontWeight: FontWeight.w500, color: Colors.white.withValues(alpha: 0.95), ), ), if (createdAt != null) ...[ const SizedBox(height: 4), Text( 'Member since ${_formatDate(createdAt)}', style: TextStyle( fontSize: 12, color: Colors.white.withValues(alpha: 0.75), ), ), ], ], ), ), ], ), ), ), // ── Settings list ── SliverToBoxAdapter( child: Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 8), Text( 'Account', style: theme.textTheme.titleMedium?.copyWith( fontWeight: FontWeight.w600, color: AppColors.textSecondary, ), ), const SizedBox(height: 8), _SettingsTile( icon: Icons.lock_outline, title: 'Change Password', onTap: () => _changePassword(context), ), _SettingsTile( icon: Icons.flag_outlined, title: 'My Reports', subtitle: 'Track report status', onTap: () => _showMyReports(context), ), const SizedBox(height: 24), Text( 'App', style: theme.textTheme.titleMedium?.copyWith( fontWeight: FontWeight.w600, color: AppColors.textSecondary, ), ), const SizedBox(height: 8), _SettingsTile( icon: Icons.info_outline, title: 'About', subtitle: 'car64', onTap: () => _showAbout(context), ), const SizedBox(height: 32), // ── Sign out ── SizedBox( width: double.infinity, child: OutlinedButton.icon( onPressed: () async { await supabase.auth.signOut(); }, icon: const Icon(Icons.logout, color: AppColors.error), label: const Text( 'Sign Out', style: TextStyle(color: AppColors.error), ), style: OutlinedButton.styleFrom( side: const BorderSide(color: AppColors.error), padding: const EdgeInsets.symmetric(vertical: 14), ), ), ), const SizedBox(height: 40), const Center( child: Text( '© 2026 car64', style: TextStyle(fontSize: 12, color: AppColors.textHint), ), ), ], ), ), ), ], ), ); } static String _formatDate(String iso) { final d = DateTime.tryParse(iso); if (d == null) return iso; const months = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]; return '${months[d.month - 1]} ${d.year}'; } void _changePassword(BuildContext context) { final controller = TextEditingController(); showDialog( context: context, builder: (_) => AlertDialog( title: const Text('Change Password'), content: TextField( controller: controller, obscureText: true, decoration: const InputDecoration( labelText: 'New password', ), ), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: const Text('Cancel'), ), ElevatedButton( onPressed: () async { final pw = controller.text.trim(); if (pw.length < 6) { showGlobalSnackBar('Password must be at least 6 characters.'); return; } try { await supabase.auth.updateUser( UserAttributes(password: pw), ); if (context.mounted) Navigator.pop(context); showGlobalSnackBar('Password updated!'); } on AuthException catch (e) { showGlobalSnackBar(e.message, isError: true); } }, child: const Text('Save'), ), ], ), ); } void _showAbout(BuildContext context) { Navigator.of(context).push( MaterialPageRoute(builder: (_) => const AboutScreen()), ); } void _showMyReports(BuildContext context) { Navigator.of(context).push( MaterialPageRoute(builder: (_) => const MyReportsScreen()), ); } } // ── Settings tile widget ────────────────────────────────────────────── class _SettingsTile extends StatelessWidget { final IconData icon; final String title; final String? subtitle; final VoidCallback onTap; const _SettingsTile({ required this.icon, required this.title, this.subtitle, required this.onTap, }); @override Widget build(BuildContext context) { return Card( margin: const EdgeInsets.symmetric(vertical: 4), child: ListTile( leading: Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: AppColors.orange.withValues(alpha: 0.1), borderRadius: BorderRadius.circular(10), ), child: Icon(icon, color: AppColors.orange, size: 22), ), title: Text( title, style: const TextStyle(fontWeight: FontWeight.w500), ), subtitle: subtitle != null ? Text(subtitle!, style: const TextStyle(fontSize: 12)) : null, trailing: const Icon(Icons.chevron_right, color: AppColors.textHint), onTap: onTap, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(14)), ), ); } }