diff options
| author | Ariel Costas Guerrero <ariel@costas.dev> | 2025-12-28 22:24:26 +0100 |
|---|---|---|
| committer | Ariel Costas Guerrero <ariel@costas.dev> | 2025-12-28 22:25:01 +0100 |
| commit | 48ec0aae80a200d7eb50639ff4c4ca8ae564f29b (patch) | |
| tree | 8cf2a2a02a49d8295985d90679c33c5bc8375818 /src/frontend/app/api/transit.ts | |
| parent | b2ddc0ef449ccbe7f0d33e539ccdfc1baef04e2c (diff) | |
Implement displaying routes with dynamic data from OTP
Diffstat (limited to 'src/frontend/app/api/transit.ts')
| -rw-r--r-- | src/frontend/app/api/transit.ts | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/frontend/app/api/transit.ts b/src/frontend/app/api/transit.ts new file mode 100644 index 0000000..317271a --- /dev/null +++ b/src/frontend/app/api/transit.ts @@ -0,0 +1,39 @@ +import { + RouteDetailsSchema, + RouteSchema, + type Route, + type RouteDetails, +} from "./schema"; + +export const fetchRoutes = async (feeds: string[] = []): Promise<Route[]> => { + const params = new URLSearchParams(); + feeds.forEach((f) => params.append("feeds", f)); + + const resp = await fetch(`/api/transit/routes?${params.toString()}`, { + headers: { + Accept: "application/json", + }, + }); + + if (!resp.ok) { + throw new Error(`HTTP ${resp.status}: ${resp.statusText}`); + } + + const data = await resp.json(); + return RouteSchema.array().parse(data); +}; + +export const fetchRouteDetails = async (id: string): Promise<RouteDetails> => { + const resp = await fetch(`/api/transit/routes/${encodeURIComponent(id)}`, { + headers: { + Accept: "application/json", + }, + }); + + if (!resp.ok) { + throw new Error(`HTTP ${resp.status}: ${resp.statusText}`); + } + + const data = await resp.json(); + return RouteDetailsSchema.parse(data); +}; |
