From 2f2261f764e0a0a52652bceda306f39f6f568b87 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 1 Mar 2026 10:21:52 +0000 Subject: Implement route-specific realtime filtering and route detail UI updates Co-authored-by: arielcostas <94913521+arielcostas@users.noreply.github.com> --- src/frontend/app/api/schema.ts | 1 + src/frontend/app/routes/routes-$id.tsx | 102 +++++++++++++++++++++++++++------ 2 files changed, 86 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/frontend/app/api/schema.ts b/src/frontend/app/api/schema.ts index c0c97a4..57f34b1 100644 --- a/src/frontend/app/api/schema.ts +++ b/src/frontend/app/api/schema.ts @@ -1,6 +1,7 @@ import { z } from "zod"; export const RouteInfoSchema = z.object({ + gtfsId: z.string().optional().nullable(), shortName: z.string(), colour: z.string(), textColour: z.string(), diff --git a/src/frontend/app/routes/routes-$id.tsx b/src/frontend/app/routes/routes-$id.tsx index 97f6337..6cc872d 100644 --- a/src/frontend/app/routes/routes-$id.tsx +++ b/src/frontend/app/routes/routes-$id.tsx @@ -79,6 +79,28 @@ export default function RouteDetailsPage() { true, Boolean(selectedStopId) && isTodaySelectedDate ); + const filteredRealtimeArrivals = useMemo(() => { + const arrivals = selectedStopRealtime?.arrivals ?? []; + if (arrivals.length === 0) { + return []; + } + + const routeId = id?.trim(); + const routeShortName = route?.shortName?.trim().toLowerCase(); + + return arrivals.filter((arrival) => { + const arrivalGtfsId = arrival.route.gtfsId?.trim(); + if (routeId && arrivalGtfsId) { + return arrivalGtfsId === routeId; + } + + if (routeShortName) { + return arrival.route.shortName.trim().toLowerCase() === routeShortName; + } + + return true; + }); + }, [selectedStopRealtime?.arrivals, id, route?.shortName]); usePageTitle( route?.shortName @@ -321,14 +343,33 @@ export default function RouteDetailsPage() { {selectedPattern?.geometry && ( + @@ -639,22 +680,49 @@ export default function RouteDetailsPage() {
{t("routes.loading_realtime", "Cargando...")}
- ) : ( -
- {(selectedStopRealtime?.arrivals ?? []).map( - (arrival, i) => ( - - {arrival.estimate.minutes} - {arrival.delay?.minutes - ? formatDelayMinutes(arrival.delay.minutes) - : ""} - - ) + ) : filteredRealtimeArrivals.length === 0 ? ( +
+ {t( + "routes.realtime_no_route_estimates", + "Sin estimaciones para esta línea" )}
+ ) : ( + <> +
+ + {t("routes.next_arrival", "Próximo")} + + + {filteredRealtimeArrivals[0].estimate.minutes}′ + {filteredRealtimeArrivals[0].delay?.minutes + ? formatDelayMinutes( + filteredRealtimeArrivals[0].delay.minutes + ) + : ""} + +
+ + {filteredRealtimeArrivals.length > 1 && ( +
+ {filteredRealtimeArrivals + .slice(1) + .map((arrival, i) => ( + + {arrival.estimate.minutes}′ + {arrival.delay?.minutes + ? formatDelayMinutes( + arrival.delay.minutes + ) + : ""} + + ))} +
+ )} + )}
)} -- cgit v1.3