fix(eta): show schedules even if location is still loading
This commit is contained in:
@ -71,53 +71,50 @@ export function useETA() {
|
||||
return;
|
||||
}
|
||||
|
||||
// Si no tenemos parada aún, no podemos calcular ETA real, pero sabemos que SÍ hay buses.
|
||||
// Mantenemos el estado 'cargando' hasta que llegue la parada.
|
||||
if (!parada_cercana) return;
|
||||
|
||||
// PASO 2: Obtener detalles de la ruta y todas sus paradas para calcular distancia
|
||||
const [routeRes, stopsRes] = await Promise.all([
|
||||
supabase
|
||||
.from('routes')
|
||||
.select('distance_km, average_speed_kmh')
|
||||
.eq('id', ruta_id)
|
||||
.single(),
|
||||
supabase
|
||||
.from('route_stops')
|
||||
.select('stop_id, stop_order, bus_stops(latitude, longitude)')
|
||||
.eq('route_id', ruta_id)
|
||||
.order('stop_order', { ascending: true })
|
||||
]);
|
||||
let minutosHastaParada = 0;
|
||||
|
||||
if (routeRes.error || !stopsRes.data) throw new Error('Error al cargar datos de ruta');
|
||||
if (parada_cercana) {
|
||||
const [routeRes, stopsRes] = await Promise.all([
|
||||
supabase
|
||||
.from('routes')
|
||||
.select('distance_km, average_speed_kmh')
|
||||
.eq('id', ruta_id)
|
||||
.single(),
|
||||
supabase
|
||||
.from('route_stops')
|
||||
.select('stop_id, stop_order, bus_stops(latitude, longitude)')
|
||||
.eq('route_id', ruta_id)
|
||||
.order('stop_order', { ascending: true })
|
||||
]);
|
||||
|
||||
const routeData = routeRes.data;
|
||||
const routeStops = stopsRes.data;
|
||||
if (!routeRes.error && stopsRes.data) {
|
||||
const routeData = routeRes.data;
|
||||
const routeStops = stopsRes.data;
|
||||
const targetStopIndex = routeStops.findIndex(s => s.stop_id === parada_cercana.id);
|
||||
|
||||
// Encontrar el orden de la parada donde está el usuario
|
||||
const targetStopIndex = routeStops.findIndex(s => s.stop_id === parada_cercana.id);
|
||||
if (targetStopIndex === -1) return;
|
||||
|
||||
// CALCULAR DISTANCIA ACUMULADA
|
||||
let distanciaAcumuladaKm = 0;
|
||||
for (let i = 0; i < targetStopIndex; i++) {
|
||||
const stopA = routeStops[i];
|
||||
const stopB = routeStops[i + 1];
|
||||
const start = stopA ? (stopA.bus_stops as any) : null;
|
||||
const end = stopB ? (stopB.bus_stops as any) : null;
|
||||
if (start?.latitude != null && start?.longitude != null &&
|
||||
end?.latitude != null && end?.longitude != null) {
|
||||
distanciaAcumuladaKm += getDistanceKm(start.latitude, start.longitude, end.latitude, end.longitude);
|
||||
if (targetStopIndex !== -1) {
|
||||
let distanciaAcumuladaKm = 0;
|
||||
for (let i = 0; i < targetStopIndex; i++) {
|
||||
const stopA = routeStops[i];
|
||||
const stopB = routeStops[i + 1];
|
||||
const start = stopA ? (stopA.bus_stops as any) : null;
|
||||
const end = stopB ? (stopB.bus_stops as any) : null;
|
||||
if (start?.latitude != null && start?.longitude != null &&
|
||||
end?.latitude != null && end?.longitude != null) {
|
||||
distanciaAcumuladaKm += getDistanceKm(start.latitude, start.longitude, end.latitude, end.longitude);
|
||||
}
|
||||
}
|
||||
distanciaAcumuladaKm *= 1.2;
|
||||
const velocidad = routeData.average_speed_kmh || VELOCIDAD_PROMEDIO_KMH;
|
||||
const tiempoViajeMinutos = (distanciaAcumuladaKm / velocidad) * 60;
|
||||
const numeroParadas = targetStopIndex;
|
||||
const tiempoParadasMinutos = (numeroParadas * TIEMPO_PARADA_SEGUNDOS) / 60;
|
||||
minutosHastaParada = tiempoViajeMinutos + tiempoParadasMinutos;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
distanciaAcumuladaKm *= 1.2;
|
||||
const velocidad = routeData.average_speed_kmh || VELOCIDAD_PROMEDIO_KMH;
|
||||
const tiempoViajeMinutos = (distanciaAcumuladaKm / velocidad) * 60;
|
||||
const numeroParadas = targetStopIndex;
|
||||
const tiempoParadasMinutos = (numeroParadas * TIEMPO_PARADA_SEGUNDOS) / 60;
|
||||
const minutosHastaParada = tiempoViajeMinutos + tiempoParadasMinutos;
|
||||
|
||||
// PASO 3: Calcular ETA para cada salida
|
||||
const ahora = new Date();
|
||||
const minutosAhora = ahora.getHours() * 60 + ahora.getMinutes();
|
||||
|
||||
Reference in New Issue
Block a user