import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import '../../core/services/auth_controller.dart'; class LoginPage extends ConsumerStatefulWidget { const LoginPage({super.key}); @override ConsumerState createState() => _LoginPageState(); } class _LoginPageState extends ConsumerState { final _formKey = GlobalKey(); final _emailController = TextEditingController(); final _passwordController = TextEditingController(); bool _obscurePassword = true; @override void dispose() { _emailController.dispose(); _passwordController.dispose(); super.dispose(); } Future _submit() async { if (!(_formKey.currentState?.validate() ?? false)) { return; } try { await ref .read(authControllerProvider.notifier) .login( email: _emailController.text.trim(), password: _passwordController.text, ); if (!mounted) { return; } final authState = ref.read(authControllerProvider).asData?.value; if (authState?.userRole == 'admin') { context.go('/admin'); return; } if (authState?.userRole == 'driver') { context.go('/driver'); return; } final routeId = authState?.routeId; if (routeId != null && routeId.isNotEmpty) { context.go('/home?routeId=$routeId'); return; } context.go('/home'); } catch (error) { if (!mounted) { return; } ScaffoldMessenger.of( context, ).showSnackBar(SnackBar(content: Text(error.toString()))); } } @override Widget build(BuildContext context) { final authState = ref.watch(authControllerProvider); final loading = authState.isLoading; return Scaffold( body: SafeArea( child: Center( child: SingleChildScrollView( padding: const EdgeInsets.all(24), child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 420), child: Form( key: _formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const SizedBox(height: 12), const Icon(Icons.delete_outline_rounded, size: 54), const SizedBox(height: 16), Text( 'Recolecta', textAlign: TextAlign.center, style: Theme.of(context).textTheme.headlineMedium ?.copyWith(fontWeight: FontWeight.w700), ), const SizedBox(height: 8), Text( 'Accede para ver solo tu ruta asignada.', textAlign: TextAlign.center, style: Theme.of(context).textTheme.bodyMedium, ), const SizedBox(height: 28), TextFormField( controller: _emailController, keyboardType: TextInputType.emailAddress, decoration: const InputDecoration( labelText: 'Correo electrónico', hintText: 'tu@correo.com', ), validator: (value) => (value == null || value.trim().isEmpty) ? 'Ingresa tu correo' : null, ), const SizedBox(height: 16), TextFormField( controller: _passwordController, obscureText: _obscurePassword, decoration: InputDecoration( labelText: 'Contraseña', hintText: '••••••••', suffixIcon: IconButton( onPressed: () => setState( () => _obscurePassword = !_obscurePassword, ), icon: Icon( _obscurePassword ? Icons.visibility_outlined : Icons.visibility_off_outlined, ), ), ), validator: (value) => (value == null || value.length < 6) ? 'La contraseña debe tener al menos 6 caracteres' : null, ), const SizedBox(height: 24), SizedBox( height: 52, child: FilledButton( onPressed: loading ? null : _submit, child: loading ? const SizedBox( width: 20, height: 20, child: CircularProgressIndicator( strokeWidth: 2, ), ) : const Text('Entrar'), ), ), const SizedBox(height: 16), TextButton( onPressed: () => context.go('/register'), child: const Text('Crear cuenta'), ), ], ), ), ), ), ), ), ); } }