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 RegisterPage extends ConsumerStatefulWidget { const RegisterPage({super.key}); @override ConsumerState createState() => _RegisterPageState(); } class _RegisterPageState extends ConsumerState { final _formKey = GlobalKey(); final _emailController = TextEditingController(); final _phoneController = TextEditingController(); final _passwordController = TextEditingController(); final _confirmPasswordController = TextEditingController(); bool _obscurePassword = true; @override void dispose() { _emailController.dispose(); _phoneController.dispose(); _passwordController.dispose(); _confirmPasswordController.dispose(); super.dispose(); } Future _submit() async { if (!(_formKey.currentState?.validate() ?? false)) { return; } try { await ref .read(authControllerProvider.notifier) .register( email: _emailController.text.trim(), phone: _phoneController.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.person_add_alt_1_outlined, size: 54), const SizedBox(height: 16), Text( 'Crear cuenta', textAlign: TextAlign.center, style: Theme.of(context).textTheme.headlineMedium ?.copyWith(fontWeight: FontWeight.w700), ), const SizedBox(height: 8), Text( 'Registra tu correo, teléfono y contraseña para continuar.', 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: _phoneController, keyboardType: TextInputType.phone, decoration: const InputDecoration( labelText: 'Teléfono', hintText: '+52 461 123 4567', ), validator: (value) => (value == null || value.trim().isEmpty) ? 'Ingresa tu teléfono' : 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: 16), TextFormField( controller: _confirmPasswordController, obscureText: _obscurePassword, decoration: const InputDecoration( labelText: 'Confirmar contraseña', hintText: '••••••••', ), validator: (value) { if (value == null || value.isEmpty) { return 'Confirma tu contraseña'; } if (value != _passwordController.text) { return 'Las contraseñas no coinciden'; } return 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('Registrarme'), ), ), const SizedBox(height: 16), TextButton( onPressed: () => context.go('/login'), child: const Text('Ya tengo cuenta'), ), ], ), ), ), ), ), ), ); } }