Commit final

This commit is contained in:
2026-05-23 09:31:45 -06:00
parent 8fe3665ffb
commit 14a6498c83
18 changed files with 102 additions and 102 deletions

View File

@@ -36,7 +36,7 @@ final _chatTree = _ChatNode('Hola, soy el asistente de Celaya Limpia. ¿En que t
'El aceite de cocina usado NO va a la basura ni al drenaje.\n\n'
'1. Dejalo enfriar completamente\n'
'2. Guardalo en botella de PET cerrada\n'
'3. Llevalo a los puntos de acopio del Ayuntamiento de Celaya\n\n'
'3. Llevalo a los puntos de acopio del Dir. Gral. Servicios Municipales\n\n'
'El aceite reciclado se convierte en biodiesel.',
[], isAnswer: true)),
])),
@@ -62,7 +62,7 @@ final _chatTree = _ChatNode('Hola, soy el asistente de Celaya Limpia. ¿En que t
'Depositalas en:\n'
'- Supermercados (contenedores naranjas)\n'
'- Tiendas de electronica\n'
'- Oficinas del Ayuntamiento de Celaya\n\n'
'- Oficinas del Dir. Gral. Servicios Municipales\n\n'
'1 pila puede contaminar 600,000 litros de agua.',
[], isAnswer: true)),
])),
@@ -86,7 +86,7 @@ final _chatTree = _ChatNode('Hola, soy el asistente de Celaya Limpia. ¿En que t
'Despues de que el camion pase por tu zona, '
'la app te mostrara una notificacion para calificar.\n\n'
'Puedes dar de 1 a 5 estrellas y dejar un comentario.\n\n'
'Tus calificaciones ayudan al Ayuntamiento a identificar '
'Tus calificaciones ayudan a la Direccion General a identificar '
'colonias con problemas y mejorar el servicio.',
[], isAnswer: true)),
])),
@@ -94,7 +94,7 @@ final _chatTree = _ChatNode('Hola, soy el asistente de Celaya Limpia. ¿En que t
'Para situaciones urgentes:\n\n'
'- Reporte de incidencias: usa la seccion "Reportar" en la app\n'
'- Emergencias: llama al 911\n'
'- Ayuntamiento de Celaya: (461) 614-8000\n'
'- Dir. Gral. Servicios Municipales: (461) 614-8000\n'
'- SEMARNAT Guanajuato: (477) 717-2600\n\n'
'Para basura clandestina o tiraderos ilegales, reportalo al municipio.',
[], isAnswer: true)),

View File

@@ -6,21 +6,21 @@ class CitizenGuiaScreen extends StatelessWidget {
const CitizenGuiaScreen({super.key});
static const _cats = [
_Cat(Icons.grass,Color(0xFF2E7D32),'Orgánicos','Restos de comida, jardín','🟢 Bolsa Verde',[
_Cat(Icons.grass,Color(0xFF2E7D32),'Orgánicos','Restos de comida, jardín',' Bolsa Verde',[
'Frutas y verduras','Cáscaras de huevo','Posos de café y té',
'Restos de comida preparada','Pasto y hojas','Cáscaras de semillas'],
['Aceites en exceso','Carnes en grandes cantidades']),
_Cat(Icons.recycling,Color(0xFF1565C0),'Reciclables','Papel, plástico, vidrio, metal','🔵 Bolsa Azul',[
_Cat(Icons.recycling,Color(0xFF1565C0),'Reciclables','Papel, plástico, vidrio, metal',' Bolsa Azul',[
'Botellas PET','Latas de aluminio','Cartón y papel limpio',
'Vidrio (botellas, frascos)','Periódico y revistas'],
['Vidrio roto sin envolver','Papel sucio o mojado','Unicel']),
_Cat(Icons.delete,Color(0xFF757575),'No Reciclables','Residuos que no se reusan','⚫ Bolsa Negra',[
'Pañales desechables','Toallas sanitarias','Papel higiénico usado',
'Colillas de cigarro','Cerámica rota'],['Baterías','Medicamentos','Aceite usado']),
_Cat(Icons.warning_amber,Color(0xFFC62828),'Peligrosos','Requieren manejo especial','🔴 Separado',[
_Cat(Icons.warning_amber,Color(0xFFC62828),'Peligrosos','Requieren manejo especial',' Separado',[
'Agujas y jeringas','Medicamentos vencidos','Pilas y baterías',
'Aceite de cocina usado','Pintura y solventes'],[],isWarn:true),
_Cat(Icons.devices_other,Color(0xFFE65100),'Electrónicos (RAEE)','Aparatos electrónicos','🟠 Punto de acopio',[
_Cat(Icons.devices_other,Color(0xFFE65100),'Electrónicos (RAEE)','Aparatos electrónicos',' Punto de acopio',[
'Celulares viejos','Computadoras','Televisiones',
'Focos ahorradores','Cables y cargadores'],[],isSpecial:true),
];
@@ -59,8 +59,8 @@ class CitizenGuiaScreen extends StatelessWidget {
child:const Column(crossAxisAlignment:CrossAxisAlignment.start, children:[
Text('¿Por qué separar tu basura?',style:TextStyle(fontWeight:FontWeight.bold,color:Color(0xFF2E7D32))),
SizedBox(height:6),
Text('♻️ El 60% de los residuos en México pueden reciclarse o compostarse, pero solo el 5% lo hace.\n'
'🌱 Separar correctamente reduce la contaminación del suelo y agua, genera empleos verdes '
Text(' El 60% de los residuos en México pueden reciclarse o compostarse, pero solo el 5% lo hace.\n'
'Separar correctamente reduce la contaminación del suelo y agua, genera empleos verdes '
'y disminuye los gases de efecto invernadero producidos en rellenos sanitarios.',
style:TextStyle(fontSize:12,color:Colors.black87)),
])),
@@ -115,14 +115,14 @@ class _CatCardState extends State<_CatCard> {
if (_open) Padding(padding:const EdgeInsets.fromLTRB(14,0,14,14),
child:Column(crossAxisAlignment:CrossAxisAlignment.start, children:[
const SizedBox(height:8),
Text(' Qué va aquí:',style:TextStyle(fontWeight:FontWeight.bold,color:c.color,fontSize:12)),
Text(' Qué va aquí:',style:TextStyle(fontWeight:FontWeight.bold,color:c.color,fontSize:12)),
const SizedBox(height:4),
...c.items.map((e)=>Padding(padding:const EdgeInsets.symmetric(vertical:2),
child:Row(children:[Icon(Icons.check_circle_outline,size:13,color:c.color),
const SizedBox(width:6),Text(e,style:const TextStyle(fontSize:12))]))),
if (c.noItems.isNotEmpty) ...[
const SizedBox(height:8),
const Text(' NO incluir:',style:TextStyle(fontWeight:FontWeight.bold,color:AppColors.rojoError,fontSize:12)),
const Text(' NO incluir:',style:TextStyle(fontWeight:FontWeight.bold,color:AppColors.rojoError,fontSize:12)),
...c.noItems.map((e)=>Padding(padding:const EdgeInsets.symmetric(vertical:2),
child:Row(children:[const Icon(Icons.cancel_outlined,size:13,color:AppColors.rojoError),
const SizedBox(width:6),Text(e,style:const TextStyle(fontSize:12,color:AppColors.rojoError))]))),
@@ -132,7 +132,7 @@ class _CatCardState extends State<_CatCard> {
Container(padding:const EdgeInsets.all(8),
decoration:BoxDecoration(color:Colors.orange.shade50,borderRadius:BorderRadius.circular(6),
border:Border.all(color:Colors.orange.shade200)),
child:const Text('📍 Lleva a puntos de acopio autorizados por el municipio.',
child:const Text(' Lleva a puntos de acopio autorizados por el municipio.',
style:TextStyle(fontSize:11))),
],
if (c.isWarn) ...[
@@ -140,7 +140,7 @@ class _CatCardState extends State<_CatCard> {
Container(padding:const EdgeInsets.all(8),
decoration:BoxDecoration(color:Colors.red.shade50,borderRadius:BorderRadius.circular(6),
border:Border.all(color:Colors.red.shade200)),
child:const Text('⚠️ NUNCA mezcles residuos peligrosos con basura común.',
child:const Text(' NUNCA mezcles residuos peligrosos con basura común.',
style:TextStyle(fontSize:11))),
],
])),

View File

@@ -238,7 +238,7 @@ class _ReviewPromptCard extends StatelessWidget {
side: BorderSide(color: Colors.amber.shade300, width: 1.5)),
child: Padding(padding: const EdgeInsets.all(14), child: Column(children: [
const Row(children: [
Text('', style: TextStyle(fontSize: 24)),
Text('', style: TextStyle(fontSize: 24)),
SizedBox(width: 8),
Expanded(child: Text('¿Cómo estuvo el servicio de hoy?',
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 14))),
@@ -296,7 +296,7 @@ class _RouteInfoCard extends StatelessWidget {
]),
])));
String _turnoLabel(String t) => t=='MATUTINO'?'🌄 Matutino':t=='VESPERTINO'?'🌅 Vespertino':'🌙 Nocturno';
String _turnoLabel(String t) => t=='MATUTINO'?'Matutino':t=='VESPERTINO'?'Vespertino':'Nocturno';
}
class _BasicRouteInfo extends StatelessWidget {
@@ -330,9 +330,9 @@ class _WarningNoPursue extends StatelessWidget {
Icon(Icons.warning_amber_rounded, color: AppColors.rojoError, size: 20),
SizedBox(width: 8),
Expanded(child: Text(
'⚠️ Ya es momento de sacar tu basura.\n'
' Ya es momento de sacar tu basura.\n'
'🚫 NO persigas ni interceptes el camión en movimiento.\n'
' Coloca tus bolsas en la acera y espera.',
' Coloca tus bolsas en la acera y espera.',
style: TextStyle(fontSize: 11, color: AppColors.rojoError, fontWeight: FontWeight.w500))),
]));
}
@@ -417,8 +417,8 @@ class _RouteStatusBanner extends StatelessWidget {
final isRetrasada = status.status == RouteStatus.retrasada;
final color = isCancelled ? AppColors.rojoError : isFalla ? Colors.red.shade800 : AppColors.naranjaAlerta;
final icon = isCancelled ? Icons.cancel : isFalla ? Icons.build : Icons.access_time;
final titulo = isCancelled ? ' Ruta Cancelada Hoy'
: isFalla ? '🔧 Falla Mecánica en Servicio' : '⏱️ Servicio con Retraso';
final titulo = isCancelled ? ' Ruta Cancelada Hoy'
: isFalla ? ' Falla Mecánica en Servicio' : ' Servicio con Retraso';
return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
Container(width: double.infinity, padding: const EdgeInsets.all(16),
@@ -447,7 +447,7 @@ class _RouteStatusBanner extends StatelessWidget {
Row(children: [
Icon(Icons.admin_panel_settings, color: color, size: 16),
const SizedBox(width: 6),
Text('Mensaje del Ayuntamiento', style: TextStyle(
Text('Mensaje dla Direccion General', style: TextStyle(
fontWeight: FontWeight.bold, color: color, fontSize: 13)),
]),
const SizedBox(height: 6),
@@ -459,14 +459,14 @@ class _RouteStatusBanner extends StatelessWidget {
decoration: BoxDecoration(color: Colors.grey.shade100, borderRadius: BorderRadius.circular(8),
border: Border.all(color: Colors.grey.shade300)),
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
const Text('💡 Recomendaciones:', style: TextStyle(fontWeight: FontWeight.bold,
const Text('Recomendaciones:', style: TextStyle(fontWeight: FontWeight.bold,
fontSize: 12, color: AppColors.grisTexto)),
const SizedBox(height: 4),
Text(isCancelled
? '• Guarda tus bolsas en lugar cerrado\n• No dejes residuos en la acera\n• Revisa la app mañana'
: isRetrasada
? '• Espera el aviso de 15 minutos antes de sacar tu basura\n• El camión llegará eventualmente\n• Recibe la notificación en esta app'
: '• Espera confirmación del Ayuntamiento\n• Puede enviarse unidad de reemplazo',
: '• Espera confirmación dla Direccion General\n• Puede enviarse unidad de reemplazo',
style: const TextStyle(fontSize: 12, color: AppColors.grisTexto)),
])),
const SizedBox(height: 12),
@@ -498,7 +498,7 @@ class _EtaCard extends StatelessWidget {
Text(sim.getEtaText(routeId),
style:const TextStyle(color:Colors.white,fontSize:16,fontWeight:FontWeight.bold)),
const SizedBox(height:6),
if (dom!=null) Text(' ${dom.horarioEstimado}',
if (dom!=null) Text(' ${dom.horarioEstimado}',
style:const TextStyle(color:Colors.white60,fontSize:11)),
const SizedBox(height:10),
LinearProgressIndicator(
@@ -518,7 +518,7 @@ class _PrivacyBanner extends StatelessWidget {
child:const Row(children:[
Icon(Icons.shield_outlined,color:Colors.amber,size:18),
SizedBox(width:6),
Expanded(child:Text('🔒 Solo ves la información de tu ruta asignada.',
Expanded(child:Text(' Solo ves la información de tu ruta asignada.',
style:TextStyle(fontSize:11,color:Colors.black87))),
]));
}

View File

@@ -244,7 +244,7 @@ class _CitizenReporteScreenState extends State<CitizenReporteScreen> {
padding: const EdgeInsets.symmetric(vertical: 6),
minimumSize: Size.zero),
icon: Icon(isClosed ? Icons.lock : Icons.chat_bubble_outline, size: 14),
label: Text(isClosed ? 'Chat cerrado' : 'Escribir al Ayuntamiento',
label: Text(isClosed ? 'Chat cerrado' : 'Escribir a la Direccion General',
style: const TextStyle(fontSize: 11))))),
]));
}),

View File

@@ -41,11 +41,11 @@ class _CollectionCalendarScreenState extends State<CollectionCalendarScreen> {
final horario = rd != null ? '${rd.horaInicio}${rd.horaFin}' : dom.horarioEstimado;
Share.share(
'🗑️ Horario de recolección de basura\n'
'📍 Colonia: ${dom.colonia}\n'
'📅 Días: $diasStr\n'
' Horario: $horario\n'
'🚛 Ruta: ${dom.routeId}\n\n'
' Horario de recolección de basura\n'
' Colonia: ${dom.colonia}\n'
' Días: $diasStr\n'
' Horario: $horario\n'
' Ruta: ${dom.routeId}\n\n'
'Descarga Celaya Limpia para recibir avisos en tiempo real.',
);
}

View File

@@ -75,7 +75,7 @@ class _ReviewScreenState extends State<ReviewScreen> {
),
body: _sent
? Center(child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [
const Text('', style: TextStyle(fontSize: 64)),
const Text('', style: TextStyle(fontSize: 64)),
const SizedBox(height: 16),
const Text('¡Gracias por tu calificación!',
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold,
@@ -163,7 +163,7 @@ class _ReviewScreenState extends State<ReviewScreen> {
SizedBox(width: 6),
Expanded(child: Text(
'Tu calificación es anónima para otros ciudadanos, '
'pero el Ayuntamiento la usará para mejorar el servicio.',
'pero la Direccion General la usará para mejorar el servicio.',
style: TextStyle(fontSize: 11, color: AppColors.azulInfo))),
]),
),