import 'package:flutter/material.dart'; import 'rutas.dart'; import '../models/domicilio_model.dart'; // Ruta corregida a src/models/ class DomiciliosView extends StatefulWidget { const DomiciliosView({super.key}); @override State createState() => _DomiciliosViewState(); } class _DomiciliosViewState extends State { List domicilios = []; // Controladores para el formulario final TextEditingController nombreController = TextEditingController(); final TextEditingController coloniaController = TextEditingController(); final TextEditingController calleController = TextEditingController(); final TextEditingController numeroController = TextEditingController(); @override void dispose() { nombreController.dispose(); coloniaController.dispose(); calleController.dispose(); numeroController.dispose(); super.dispose(); } void _mostrarDialogoAgregar() { // Limpiar controladores nombreController.clear(); coloniaController.clear(); calleController.clear(); numeroController.clear(); showDialog( context: context, barrierDismissible: false, builder: (BuildContext context) { return Dialog( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(25)), child: Container( padding: const EdgeInsets.all(20), child: Column( mainAxisSize: MainAxisSize.min, children: [ // Título const Text( 'Añadir domicilio', style: TextStyle( fontSize: 24, fontWeight: FontWeight.bold, color: colorAzul, ), ), const SizedBox(height: 20), // Campo: Nombre del domicilio _buildCampoTexto( controller: nombreController, hint: 'Nombre del domicilio', icon: Icons.home_outlined, ), const SizedBox(height: 15), // Campo: Colonia _buildCampoTexto( controller: coloniaController, hint: 'Colonia', icon: Icons.location_city_outlined, ), const SizedBox(height: 15), // Campo: Calle _buildCampoTexto( controller: calleController, hint: 'Calle', icon: Icons.streetview, ), const SizedBox(height: 15), // Campo: Número _buildCampoTexto( controller: numeroController, hint: 'Número', icon: Icons.numbers, keyboardType: TextInputType.number, ), const SizedBox(height: 25), // Botones Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ // Botón Cancelar Expanded( child: OutlinedButton( style: OutlinedButton.styleFrom( side: BorderSide(color: colorAzul, width: 2), padding: const EdgeInsets.symmetric(vertical: 12), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(15), ), ), onPressed: () { Navigator.pop(context); // Cerrar diálogo sin guardar }, child: const Text( 'Cancelar', style: TextStyle(fontSize: 16, color: colorAzul), ), ), ), const SizedBox(width: 15), // Botón Agregar Expanded( child: ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: colorAzul, padding: const EdgeInsets.symmetric(vertical: 12), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(15), ), ), onPressed: () { _agregarDomicilio(); }, child: const Text( 'Agregar', style: TextStyle(fontSize: 16, color: Colors.white), ), ), ), ], ), ], ), ), ); }, ); } Widget _buildCampoTexto({ required TextEditingController controller, required String hint, required IconData icon, TextInputType keyboardType = TextInputType.text, }) { return TextField( controller: controller, keyboardType: keyboardType, decoration: InputDecoration( hintText: hint, prefixIcon: Icon(icon, color: colorAzul), border: OutlineInputBorder( borderRadius: BorderRadius.circular(15), borderSide: const BorderSide(color: colorAzul), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(15), borderSide: BorderSide(color: colorAzul.withOpacity(0.5)), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(15), borderSide: const BorderSide(color: colorAzul, width: 2), ), ), ); } void _agregarDomicilio() { // Validar que todos los campos estén llenos if (nombreController.text.isEmpty || coloniaController.text.isEmpty || calleController.text.isEmpty || numeroController.text.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Por favor, llena todos los campos'), backgroundColor: Colors.red, ), ); return; } // Crear nuevo domicilio final nuevoDomicilio = Domicilio( nombre: nombreController.text, colonia: coloniaController.text, calle: calleController.text, numero: numeroController.text, ); // Agregar a la lista setState(() { domicilios.add(nuevoDomicilio); }); // Cerrar el diálogo Navigator.pop(context); // Mostrar mensaje de éxito ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('Domicilio "${nombreController.text}" agregado'), backgroundColor: colorAzul, duration: const Duration(seconds: 2), ), ); } void _eliminarDomicilio(int index) { showDialog( context: context, builder: (BuildContext context) { return AlertDialog( title: const Text('Eliminar domicilio'), content: Text('¿Deseas eliminar "${domicilios[index].nombre}"?'), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: const Text('Cancelar'), ), TextButton( onPressed: () { setState(() { domicilios.removeAt(index); }); Navigator.pop(context); ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Domicilio eliminado'), backgroundColor: Colors.red, duration: Duration(seconds: 2), ), ); }, child: const Text('Eliminar', style: TextStyle(color: Colors.red)), ), ], ); }, ); } @override Widget build(BuildContext context) { return Container( color: Colors.white, child: SafeArea( child: Column( children: [ // AppBar personalizado Container( width: double.infinity, padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 16), decoration: const BoxDecoration( color: colorAzul, borderRadius: BorderRadius.only( bottomLeft: Radius.circular(20), bottomRight: Radius.circular(20), ), ), child: const Text( 'Domicilios', style: TextStyle( color: Colors.white, fontSize: 28, fontWeight: FontWeight.bold, ), textAlign: TextAlign.center, ), ), // Contenido Expanded( child: domicilios.isEmpty ? Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( Icons.home_outlined, size: 100, color: Colors.grey.withOpacity(0.5), ), const SizedBox(height: 20), Text( 'No hay domicilios agregados', style: TextStyle( fontSize: 18, color: Colors.grey.withOpacity(0.7), ), ), const SizedBox(height: 10), Text( 'Toca el botón + para agregar', style: TextStyle( fontSize: 14, color: Colors.grey.withOpacity(0.5), ), ), ], ), ) : ListView.builder( padding: const EdgeInsets.all(20), itemCount: domicilios.length, itemBuilder: (context, index) { final domicilio = domicilios[index]; return Padding( padding: const EdgeInsets.only(bottom: 20), child: Container( padding: const EdgeInsets.all(15), decoration: BoxDecoration( border: Border.all(color: Colors.black, width: 4), borderRadius: BorderRadius.circular(25), ), child: Row( children: [ const Icon(Icons.home_outlined, size: 60), const SizedBox(width: 10), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( domicilio.nombre, style: const TextStyle( fontSize: 22, fontWeight: FontWeight.bold, ), ), Text( domicilio.direccionCompleta, style: const TextStyle( fontSize: 18, fontWeight: FontWeight.bold, ), ), ], ), ), IconButton( onPressed: () => _eliminarDomicilio(index), icon: const Icon(Icons.delete_outline, size: 40), color: Colors.red, ), ], ), ), ); }, ), ), // Botón flotante de agregar Padding( padding: const EdgeInsets.all(20), child: GestureDetector( onTap: _mostrarDialogoAgregar, child: Container( width: double.infinity, height: 100, decoration: BoxDecoration( color: colorAzul, borderRadius: BorderRadius.circular(20), ), child: const Icon(Icons.add, color: Colors.white, size: 80), ), ), ), ], ), ), ); } }