Documentation Index
Fetch the complete documentation index at: https://mintlify.com/danitocsc/transporte-unrc-web-public/llms.txt
Use this file to discover all available pages before exploring further.
PublicMapPage es el componente raíz de la vista pública del mapa de paradas. Declarado con la directiva 'use client', se ejecuta exclusivamente en el navegador y orquesta toda la interacción del usuario: geolocalización, selección de paradas, filtrado por ruta y apertura del panel lateral. Recibe sus datos como props desde el Server Component padre, que los carga en el servidor mediante loadSiteData().
Este componente importa
PublicStopsMap con dynamic({ ssr: false }) para evitar que Leaflet/MapLibre intente acceder a window durante la renderización en el servidor de Next.js.Props
Lista completa de paradas piloto cargadas desde los datos del servidor. Cada elemento incluye coordenadas, nombre, ruta asignada, turno y días de servicio. Ver
PublicStop para la forma exacta del objeto.Lista de rutas piloto. Cada ruta contiene un id, nombre, color hexadecimal y arreglo de puntos que forman la polilínea. Ver
PublicRoute.Payload del informe de demanda (
SummaryPayload) pasado como objeto genérico. Este componente no consume directamente los campos del resumen — los datos se usan en la página /informe.Estado interno (useState)
El componente administra nueve piezas de estado local:
| Variable | Tipo | Valor inicial | Descripción |
|---|---|---|---|
userLocation | [number, number] | null | null | Coordenadas GPS del navegador (latitud, longitud). Se actualiza tras un fix de geolocalización exitoso. |
nearestStopId | string | null | null | id de la parada más cercana al usuario, calculado con Haversine. |
selectedStop | PublicStop | null | null | Parada actualmente seleccionada en la lista o en el mapa. |
geoError | string | null | null | Mensaje de error de la API de geolocalización del navegador. |
geoLoading | boolean | false | true mientras se espera la respuesta de getCurrentPosition. |
filterRoute | string | 'all' | ID de la ruta activa para el filtro, o 'all' para mostrar todas. |
sidebarOpen | boolean | false | Controla la visibilidad del panel lateral. |
userTurno | string | '' | Turno seleccionado por el usuario: 'Matutino', 'Intermedio', 'Vespertino' o cadena vacía. |
errorLog | string | null | null | Mensaje del último error JavaScript no manejado capturado por el listener global window.addEventListener('error', ...). Se muestra en un banner rojo en la parte superior de la página. |
Parámetro de URL ?sidebar=true
Al montar el componente, un useEffect que depende de searchParams lee el parámetro sidebar:
/mapa?sidebar=true.
Fórmula Haversine
haversine es una función auxiliar interna (no exportada) que calcula la distancia en kilómetros entre dos puntos geográficos usando la gran-elipse terrestre:
- Dentro de
handleGeolocate()para ordenar todas las paradas por proximidad al usuario. - En el panel lateral para mostrar la distancia exacta entre
userLocationynearestStop.
handleGeolocate()
Llama a navigator.geolocation.getCurrentPosition con alta precisión y un timeout de 10 segundos. Flujo completo:
Valores memoizados (useMemo)
filteredStops es el arreglo que se pasa a PublicStopsMap — cuando el usuario selecciona una ruta específica, el mapa solo muestra los marcadores de esa ruta.
Horarios estimados por turno
El selector de turno en el panel muestra el horario de salida estimado para el servicio piloto:| Turno | Horario estimado |
|---|---|
| Matutino | 06:30 AM |
| Intermedio | 11:00 AM |
| Vespertino | 03:30 PM |
Mapa de nombres de rutas
El objetoROUTE_NAMES traduce los IDs técnicos de las rutas a nombres legibles para el usuario en los botones de filtro:
ROUTE_NAMES, el componente usa r.name como fallback.
Importación dinámica de PublicStopsMap
ssr: false es obligatoria porque MapLibre GL accede a window, document y la API Canvas al inicializarse — objetos inexistentes en el entorno Node.js de Next.js. Mientras el bundle del mapa se descarga, se muestra un placeholder gris con animación pulse.
Manejo de errores globales
Al montar, el componente registra dos listeners globales para capturar errores de JavaScript no manejados y mostrarlos en un banner rojo en la parte superior:"Script error." (con o sin mayúscula inicial) o aquellos sin filename o con lineno === 0 se ignoran silenciosamente. Estos corresponden a scripts cross-origin como extensiones de traducción o herramientas del navegador que no pertenecen al código de la aplicación.
Árbol de renderizado
El panel lateral (
<aside>) usa posicionamiento absolute en móvil y relative en desktop, superponiéndose al mapa en pantallas pequeñas y desplazando el mapa lateralmente en pantallas medianas y mayores.