Co-authored-by: MENDOZA BALLARDO GAEL RICARDO <gael-meb123@users.noreply.github.com> Co-authored-by: Azareth-Tr <Azareth-Tr@users.noreply.github.com> modificacion de las vistas principales para el usuario ciudadano, primer avance para el panel admin
73 lines
1.9 KiB
Dart
73 lines
1.9 KiB
Dart
// lib/features/eta/eta_model.dart
|
||
// Modelo de respuesta del endpoint GET /eta?address_id=X
|
||
// El backend NUNCA devuelve coordenadas; solo texto y status.
|
||
|
||
enum RouteStatus {
|
||
pendiente,
|
||
enRuta,
|
||
completada,
|
||
diferida,
|
||
reasignada,
|
||
}
|
||
|
||
RouteStatus routeStatusFromString(String s) {
|
||
switch (s) {
|
||
case 'en_ruta':
|
||
return RouteStatus.enRuta;
|
||
case 'completada':
|
||
return RouteStatus.completada;
|
||
case 'diferida':
|
||
return RouteStatus.diferida;
|
||
case 'reasignada':
|
||
return RouteStatus.reasignada;
|
||
default:
|
||
return RouteStatus.pendiente;
|
||
}
|
||
}
|
||
|
||
class EtaResponse {
|
||
/// Texto accionable que muestra el ciudadano.
|
||
/// Ejemplos: "Llega en aproximadamente 15 minutos"
|
||
/// "Servicio del día finalizado"
|
||
final String mensaje;
|
||
|
||
/// Estado de la ruta para mostrar el badge correcto.
|
||
final RouteStatus status;
|
||
|
||
/// Ventana horaria opcional, ej. "7:20–7:35 p.m."
|
||
/// Solo presente cuando positionId == 4 (TRUCK_PROXIMITY).
|
||
final String? ventanaHoraria;
|
||
|
||
const EtaResponse({
|
||
required this.mensaje,
|
||
required this.status,
|
||
this.ventanaHoraria,
|
||
});
|
||
|
||
factory EtaResponse.fromJson(Map<String, dynamic> json) {
|
||
return EtaResponse(
|
||
mensaje: json['mensaje'] as String,
|
||
status: routeStatusFromString(json['status'] as String),
|
||
ventanaHoraria: json['ventana_horaria'] as String?,
|
||
);
|
||
}
|
||
|
||
/// Estado de progreso local (0-3) mapeado al positionId del backend.
|
||
/// Útil para la barra de 4 pasos en la UI.
|
||
int get stepIndex {
|
||
switch (status) {
|
||
case RouteStatus.pendiente:
|
||
return 0;
|
||
case RouteStatus.enRuta:
|
||
return 1;
|
||
case RouteStatus.completada:
|
||
return 3;
|
||
default:
|
||
return 2;
|
||
}
|
||
}
|
||
|
||
bool get isCompleted => status == RouteStatus.completada;
|
||
bool get isNearby =>
|
||
ventanaHoraria != null && status == RouteStatus.enRuta;
|
||
} |