import { isRouteErrorResponse, Link, Links, Meta, Outlet, Scripts, ScrollRestoration, } from "react-router"; import type { Route } from "./+types/root"; import "@fontsource-variable/roboto"; import "./root.css"; //#region Maplibre setup import "maplibre-theme/icons.default.css"; import "maplibre-theme/modern.css"; import { Protocol } from "pmtiles"; import maplibregl, { type LngLatLike } from "maplibre-gl"; import { AppProvider } from "./AppContext"; import { swManager } from "./utils/serviceWorkerManager"; import { UpdateNotification } from "./components/UpdateNotification"; import { useEffect } from "react"; const pmtiles = new Protocol(); maplibregl.addProtocol("pmtiles", pmtiles.tile); //#endregion import "./i18n"; export const links: Route.LinksFunction = () => []; export function HydrateFallback() { return "Loading..."; } export function Layout({ children }: { children: React.ReactNode }) { return ( Busurbano {children} ); } // Helper: check if coordinates are within Vigo bounds function isWithinVigo(lngLat: LngLatLike): boolean { let lng: number, lat: number; if (Array.isArray(lngLat)) { [lng, lat] = lngLat; } else if ("lng" in lngLat && "lat" in lngLat) { lng = lngLat.lng; lat = lngLat.lat; } else { return false; } // Rough bounding box for Vigo return lat >= 42.18 && lat <= 42.3 && lng >= -8.78 && lng <= -8.65; } import NavBar from "./components/NavBar"; export default function App() { useEffect(() => { // Initialize service worker swManager.initialize(); }, []); return (
); } export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) { let message = "Oops!"; let details = "An unexpected error occurred."; let stack: string | undefined; if (isRouteErrorResponse(error)) { message = error.status === 404 ? "404" : "Error"; details = error.status === 404 ? "The requested page could not be found." : error.statusText || details; } else if (import.meta.env.DEV && error && error instanceof Error) { details = error.message; stack = error.stack; } return (

{message}

{details}

{stack && (
          {stack}
        
)}
); }