aboutsummaryrefslogtreecommitdiff
path: root/src/frontend/app/routes
diff options
context:
space:
mode:
authorCopilot <198982749+Copilot@users.noreply.github.com>2026-03-05 18:24:51 +0100
committerGitHub <noreply@github.com>2026-03-05 18:24:51 +0100
commit49ef6f4af837d4f3f4f367fa831f1ff176036c27 (patch)
tree157c5f7fbbfb4da181a3dce9fb8e4700d82b5231 /src/frontend/app/routes
parent6e2d9ffe812eb1ca8fe5d04d3df2aa322e9e5760 (diff)
Show probable traffic restriction warning on Xunta legs within urban municipalities (#141)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: arielcostas <94913521+arielcostas@users.noreply.github.com> Co-authored-by: Ariel Costas Guerrero <ariel@costas.dev>
Diffstat (limited to 'src/frontend/app/routes')
-rw-r--r--src/frontend/app/routes/planner.tsx42
1 files changed, 40 insertions, 2 deletions
diff --git a/src/frontend/app/routes/planner.tsx b/src/frontend/app/routes/planner.tsx
index 1f64590..5fd0ce7 100644
--- a/src/frontend/app/routes/planner.tsx
+++ b/src/frontend/app/routes/planner.tsx
@@ -1,4 +1,4 @@
-import { Coins, CreditCard, Footprints } from "lucide-react";
+import { AlertTriangle, Coins, CreditCard, Footprints } from "lucide-react";
import maplibregl from "maplibre-gl";
import "maplibre-gl/dist/maplibre-gl.css";
import React, { useEffect, useMemo, useRef, useState } from "react";
@@ -72,6 +72,25 @@ const sumWalkMetrics = (legs: Itinerary["legs"]) => {
return { meters, minutes: Math.max(0, Math.round(minutes)) };
};
+const URBAN_MUNICIPALITIES: Record<string, string> = {
+ "15030": "A Coruña",
+ "27028": "Lugo",
+ "32054": "Ourense",
+ "15078": "Santiago de Compostela",
+ "36057": "Vigo",
+};
+
+const getUrbanMunicipalityWarning = (
+ leg: Itinerary["legs"][number]
+): string | null => {
+ if (leg.feedId !== "xunta") return null;
+ const fromMunicipality = leg.from?.zoneId?.substring(0, 5);
+ const toMunicipality = leg.to?.zoneId?.substring(0, 5);
+ if (!fromMunicipality || !toMunicipality) return null;
+ if (fromMunicipality !== toMunicipality) return null;
+ return URBAN_MUNICIPALITIES[fromMunicipality] ?? null;
+};
+
const ItinerarySummary = ({
itinerary,
onClick,
@@ -653,6 +672,25 @@ const ItineraryDetail = ({
</ul>
</details>
)}
+ {(() => {
+ const municipality = getUrbanMunicipalityWarning(leg);
+ if (!municipality) return null;
+ return (
+ <div className="mt-2 flex items-start gap-2 rounded-md bg-yellow-50 dark:bg-yellow-900/30 border border-yellow-300 dark:border-yellow-700 px-3 py-2 text-xs text-yellow-800 dark:text-yellow-200">
+ <AlertTriangle className="w-4 h-4 shrink-0 mt-0.5 text-yellow-600 dark:text-yellow-400" />
+ <div>
+ <div className="font-semibold">
+ {t("planner.urban_traffic_warning")}
+ </div>
+ <div>
+ {t("planner.urban_traffic_warning_desc", {
+ municipality,
+ })}
+ </div>
+ </div>
+ </div>
+ );
+ })()}
</>
)}
</div>
@@ -668,7 +706,7 @@ const ItineraryDetail = ({
export default function PlannerPage() {
const { t } = useTranslation();
- usePageTitle(t("navbar.planner", "Planificador"));
+ () => usePageTitle(t("navbar.planner", "Planificador"));
const location = useLocation();
const {
plan,