refactor(map): fix race conditions and async issues with atomic GPS/Data fetch

This commit is contained in:
2026-03-02 19:22:58 -05:00
parent 4f8096f425
commit 767667b1b6
3 changed files with 61 additions and 37 deletions

View File

@ -37,7 +37,7 @@ const { estasCargando: estasCargandoRuta, errorRuta } = useDirectionsRoute();
const { encontrarParadaCercana, paradaCercana, distanciaMetros, duracionCaminata, limpiarCaminata } = useParadaCercana();
const { calcularETA, busesActivos, cargando: etaCargando } = useETA();
const { procesarSeleccionDeRuta } = useFlujoPrincipal();
const { procesarSeleccionDeRuta, cargando: flujoCargando } = useFlujoPrincipal();
const { limpiarMapa: limpiarTodoCentralizado } = useMapState();
const showETACard = ref(false);
@ -237,20 +237,22 @@ function reDrawUserMarker() {
async function updateMapMarkers(skipZoom = false) {
if (!isLoaded.value || !map.value || isUpdatingMarkers.value) return;
isUpdatingMarkers.value = true;
const currentRequestRouteId = routeStore.selectedRouteId;
const stops = [...routeStore.selectedRouteStops];
if (!currentRequestRouteId) {
clearMapMarkers();
return;
}
isUpdatingMarkers.value = true;
try {
if (!currentRequestRouteId || stops.length === 0) {
clearMapMarkers();
return;
}
const selectedRouteObj = routeStore.allRoutes.find(r => r.id === currentRequestRouteId) || { id: currentRequestRouteId, short_name: currentRequestRouteId };
// ── PASO ATÓMICO: Procesar con carga paralela de GPS y Paradas ──
// Pasamos [] a paradasExistentes para forzar que procesarSeleccionDeRuta maneje el Promise.all
await procesarSeleccionDeRuta(
selectedRouteObj,
stops as BusStop[],
routeStore.selectedRouteStops, // El composable decidirá si necesita recargar en paralelo
map.value,
addCleanMarker,
skipZoom,
@ -326,6 +328,7 @@ function selectRouteAndClose(route: any) {
highlightOptimalStopForRoute();
return;
}
showUberSearch.value = false;
routeStore.wasSelectedFromMap = true;
routeStore.selectRoute(route.id, route.name);
@ -476,8 +479,8 @@ watch([() => authStore.userProfile?.auto_location, isLoaded], ([canLocate, loade
<div class="split-view">
<div class="map-side">
<div class="map-view">
<div v-if="estasCargandoRuta || errorRuta" class="status-indicator">
<div v-if="estasCargandoRuta" class="loading-pill">{{ t('map.calculatingRoute') }}</div>
<div v-if="flujoCargando || estasCargandoRuta || errorRuta" class="status-indicator">
<div v-if="flujoCargando || estasCargandoRuta" class="loading-pill">{{ t('map.calculatingRoute') }}</div>
<div v-if="errorRuta" class="error-pill">{{ errorRuta }}</div>
</div>