import StopDataProvider from "../data/StopDataProvider"; import "./map.css"; import { useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { Layer, Source, type MapLayerMouseEvent, type MapRef, } from "react-map-gl/maplibre"; import { useNavigate } from "react-router"; import { PlannerOverlay } from "~/components/PlannerOverlay"; import { AppMap } from "~/components/shared/AppMap"; import { StopSummarySheet, type StopSheetProps, } from "~/components/map/StopSummarySheet"; import { APP_CONSTANTS } from "~/config/constants"; import { usePageTitle } from "~/contexts/PageTitleContext"; import { usePlanner } from "~/hooks/usePlanner"; import { useApp } from "../AppContext"; import "../tailwind-full.css"; // Componente principal del mapa export default function StopMap() { const { t } = useTranslation(); const navigate = useNavigate(); usePageTitle(t("navbar.map", "Mapa")); const [selectedStop, setSelectedStop] = useState< StopSheetProps["stop"] | null >(null); const [isSheetOpen, setIsSheetOpen] = useState(false); const mapRef = useRef(null); const { searchRoute } = usePlanner(); // Handle click events on clusters and individual stops const onMapClick = (e: MapLayerMouseEvent) => { const features = e.features; if (!features || features.length === 0) { console.debug( "No features found on map click. Position:", e.lngLat, "Point:", e.point ); return; } const feature = features[0]; handlePointClick(feature); }; const getLatitude = (center: any) => Array.isArray(center) ? center[0] : center.lat; const getLongitude = (center: any) => Array.isArray(center) ? center[1] : center.lng; const handlePointClick = (feature: any) => { const props: { id: string; code: string; name: string; routes: string; } = feature.properties; // TODO: Move ID to constant, improve type checking if (!props || feature.layer.id !== "stops") { console.warn("Invalid feature properties:", props); return; } const stopId = props.id; const routes: { shortName: string; colour: string; textColour: string; }[] = JSON.parse(props.routes || "[]"); setSelectedStop({ stopId: props.id, stopCode: props.code, name: props.name || "Unknown Stop", lines: routes.map((route) => { return { line: route.shortName, colour: route.colour, textColour: route.textColour, }; }), }); setIsSheetOpen(true); }; return (
searchRoute(o, d, time, arriveBy)} onNavigateToPlanner={() => navigate("/planner")} clearPickerOnOpen={true} showLastDestinationWhenCollapsed={false} cardBackground="bg-white/95 dark:bg-slate-900/90" /> {selectedStop && ( setIsSheetOpen(false)} stop={selectedStop} /> )}
); }