From 04d56e18c6fe20a9033876a4fdb215e1f0b5b108 Mon Sep 17 00:00:00 2001 From: imlildud Date: Fri, 22 May 2026 20:32:22 -0600 Subject: [PATCH] feat: register adress logic --- lib/src/models/domicilio_model.dart | 15 ++ lib/src/views/domicilios.dart | 344 +++++++++++++++++++++++++--- 2 files changed, 328 insertions(+), 31 deletions(-) create mode 100644 lib/src/models/domicilio_model.dart diff --git a/lib/src/models/domicilio_model.dart b/lib/src/models/domicilio_model.dart new file mode 100644 index 0000000..9e1bfef --- /dev/null +++ b/lib/src/models/domicilio_model.dart @@ -0,0 +1,15 @@ +class Domicilio { + final String nombre; + final String colonia; + final String calle; + final String numero; + + Domicilio({ + required this.nombre, + required this.colonia, + required this.calle, + required this.numero, + }); + + String get direccionCompleta => '$colonia, $calle $numero'; +} \ No newline at end of file diff --git a/lib/src/views/domicilios.dart b/lib/src/views/domicilios.dart index 12e9223..e3c9fda 100644 --- a/lib/src/views/domicilios.dart +++ b/lib/src/views/domicilios.dart @@ -1,14 +1,249 @@ -// domicilios.dart import 'package:flutter/material.dart'; import 'rutas.dart'; +import '../models/domicilio_model.dart'; // Ruta corregida a src/models/ -class DomiciliosView extends StatelessWidget { +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, // Fondo blanco para el contenido + color: Colors.white, child: SafeArea( child: Column( children: [ @@ -35,11 +270,43 @@ class DomiciliosView extends StatelessWidget { ), // Contenido Expanded( - child: Padding( - padding: const EdgeInsets.all(20.0), + child: domicilios.isEmpty + ? Center( child: Column( + mainAxisAlignment: MainAxisAlignment.center, children: [ - Container( + 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), @@ -49,37 +316,52 @@ class DomiciliosView extends StatelessWidget { children: [ const Icon(Icons.home_outlined, size: 60), const SizedBox(width: 10), - const Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('Mi Casa', - style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold)), - Text('Centro, Ruta 1', - style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), - ], + 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, + ), + ), + ], + ), ), - const Spacer(), IconButton( - onPressed: () {}, - icon: const Icon(Icons.more_horiz, size: 40), + onPressed: () => _eliminarDomicilio(index), + icon: const Icon(Icons.delete_outline, size: 40), + color: Colors.red, ), ], ), ), - const SizedBox(height: 20), - GestureDetector( - onTap: () {}, - 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), - ), - ), - ], + ); + }, + ), + ), + // 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), ), ), ),