diff options
| author | Ariel Costas Guerrero <ariel@costas.dev> | 2026-03-13 16:49:10 +0100 |
|---|---|---|
| committer | Ariel Costas Guerrero <ariel@costas.dev> | 2026-03-13 16:49:30 +0100 |
| commit | ee69c62adc5943a1dbd154df5142c0e726bdd317 (patch) | |
| tree | 5874249173aa249d4d497733ef9fc410e64ab664 /src/frontend/app/api/arrivals.ts | |
| parent | 90ad5395f6310da86fee9a29503e58ea74f3078b (diff) | |
feat(routes): add realtime estimates panel with pattern-aware styling
- New GET /api/stops/estimates endpoint (nano mode: tripId, patternId, estimate, delay only)
- useStopEstimates hook wiring estimates to routes-$id stop panel
- Pattern-aware styling: dim schedules and estimates from other patterns
- Past scheduled departures shown with strikethrough instead of hidden
- Persist selected pattern in URL hash (replace navigation, no history push)
- Fix planner arrivals using new estimates endpoint
Diffstat (limited to 'src/frontend/app/api/arrivals.ts')
| -rw-r--r-- | src/frontend/app/api/arrivals.ts | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/frontend/app/api/arrivals.ts b/src/frontend/app/api/arrivals.ts index 8ae6e78..ad99630 100644 --- a/src/frontend/app/api/arrivals.ts +++ b/src/frontend/app/api/arrivals.ts @@ -1,6 +1,8 @@ import { StopArrivalsResponseSchema, + StopEstimatesResponseSchema, type StopArrivalsResponse, + type StopEstimatesResponse, } from "./schema"; export const fetchArrivals = async ( @@ -29,3 +31,31 @@ export const fetchArrivals = async ( throw e; } }; + +export const fetchEstimates = async ( + stopId: string, + routeId: string, + viaStopId?: string +): Promise<StopEstimatesResponse> => { + let url = `/api/stops/estimates?stop=${encodeURIComponent(stopId)}&route=${encodeURIComponent(routeId)}`; + if (viaStopId) { + url += `&via=${encodeURIComponent(viaStopId)}`; + } + + const resp = await fetch(url, { + headers: { Accept: "application/json" }, + }); + + if (!resp.ok) { + throw new Error(`HTTP ${resp.status}: ${resp.statusText}`); + } + + const data = await resp.json(); + try { + return StopEstimatesResponseSchema.parse(data); + } catch (e) { + console.error("Zod parsing failed for estimates:", e); + console.log("Received data:", data); + throw e; + } +}; |
