112 lines
4.0 KiB
Dart
112 lines
4.0 KiB
Dart
import 'dart:async';
|
|
import 'package:flutter/material.dart';
|
|
import 'notificaciones_service.dart';
|
|
|
|
// ─── ESTADO GLOBAL DEL CAMIÓN ───────────────────────────────────
|
|
class CamionEstado extends ChangeNotifier {
|
|
|
|
int _positionId = 1;
|
|
Timer? _timer;
|
|
bool _corriendo = false;
|
|
|
|
// Configuración de alertas
|
|
bool notificarInicioRuta = true;
|
|
bool notificarCamionCerca = true;
|
|
bool notificarRetrasos = false;
|
|
|
|
int get positionId => _positionId;
|
|
bool get corriendo => _corriendo;
|
|
|
|
// Etiquetas de cada posición
|
|
static const Map<int, String> etapas = {
|
|
1: '🏭 En el Relleno Sanitario',
|
|
2: '🚛 Ruta iniciada',
|
|
3: '📍 En camino a tu sector',
|
|
4: '⚡ Cerca de tu domicilio',
|
|
5: '🏘️ En tu colonia',
|
|
6: '📦 Recolectando residuos',
|
|
7: '↩️ Regresando',
|
|
8: '✅ Servicio finalizado',
|
|
};
|
|
|
|
// ETA según posición
|
|
static const Map<int, Map<String, dynamic>> etaInfo = {
|
|
1: {'horaInicio': '--:--', 'horaFin': '--:--', 'minutos': 0, 'label': 'Sin servicio aún'},
|
|
2: {'horaInicio': '7:00 p.m.','horaFin': '7:40 p.m.','minutos': 40, 'label': 'Ruta iniciada'},
|
|
3: {'horaInicio': '7:10 p.m.','horaFin': '7:35 p.m.','minutos': 30, 'label': 'En camino'},
|
|
4: {'horaInicio': '7:20 p.m.','horaFin': '7:30 p.m.','minutos': 15, 'label': 'Cerca de ti'},
|
|
5: {'horaInicio': '7:25 p.m.','horaFin': '7:30 p.m.','minutos': 8, 'label': 'En tu colonia'},
|
|
6: {'horaInicio': '7:28 p.m.','horaFin': '7:30 p.m.','minutos': 2, 'label': '¡Está aquí!'},
|
|
7: {'horaInicio': '--:--', 'horaFin': '--:--', 'minutos': 0, 'label': 'Regresando'},
|
|
8: {'horaInicio': '--:--', 'horaFin': '--:--', 'minutos': 0, 'label': 'Servicio completado'},
|
|
};
|
|
|
|
// ── Iniciar timer ───────────────────────────────────────────
|
|
void iniciarTimer() {
|
|
if (_corriendo) return;
|
|
_corriendo = true;
|
|
_positionId = 1;
|
|
notifyListeners();
|
|
|
|
// Avanza cada 8 segundos (puedes cambiarlo)
|
|
_timer = Timer.periodic(const Duration(seconds: 8), (timer) async {
|
|
if (_positionId >= 8) {
|
|
detener();
|
|
return;
|
|
}
|
|
|
|
_positionId++;
|
|
notifyListeners();
|
|
|
|
// Notificación automática al iniciar ruta
|
|
if (_positionId == 2 && notificarInicioRuta) {
|
|
await enviarNotificacion(
|
|
id: 1,
|
|
titulo: '¡Ruta Iniciada!',
|
|
cuerpo: 'El camión recolector ha salido del Relleno Sanitario rumbo a tu sector. Asegúrate de tener listos tus residuos.',
|
|
);
|
|
}
|
|
|
|
// Notificación automática cuando está cerca
|
|
if (_positionId == 4 && notificarCamionCerca) {
|
|
await enviarNotificacion(
|
|
id: 2,
|
|
titulo: 'Camión Cercano 🚛',
|
|
cuerpo: 'El camión está a menos de 15 minutos de tu domicilio. Es momento de sacar tus bolsas a la acera.',
|
|
);
|
|
}
|
|
|
|
// Notificación automática al finalizar
|
|
if (_positionId == 8) {
|
|
await enviarNotificacion(
|
|
id: 3,
|
|
titulo: 'Servicio Finalizado ✅',
|
|
cuerpo: 'El camión de tu sector ha concluido su jornada de recolección diaria.',
|
|
);
|
|
}
|
|
});
|
|
}
|
|
|
|
// ── Detener timer ───────────────────────────────────────────
|
|
void detener() {
|
|
_timer?.cancel();
|
|
_corriendo = false;
|
|
notifyListeners();
|
|
}
|
|
|
|
// ── Reiniciar ───────────────────────────────────────────────
|
|
void reiniciar() {
|
|
detener();
|
|
_positionId = 1;
|
|
notifyListeners();
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_timer?.cancel();
|
|
super.dispose();
|
|
}
|
|
}
|
|
|
|
// Instancia global accesible desde cualquier archivo
|
|
final camionEstado = CamionEstado(); |