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 && (