aboutsummaryrefslogtreecommitdiff
path: root/src/frontend/app/api/transit.ts
diff options
context:
space:
mode:
authorAriel Costas Guerrero <ariel@costas.dev>2025-12-28 22:24:26 +0100
committerAriel Costas Guerrero <ariel@costas.dev>2025-12-28 22:25:01 +0100
commit48ec0aae80a200d7eb50639ff4c4ca8ae564f29b (patch)
tree8cf2a2a02a49d8295985d90679c33c5bc8375818 /src/frontend/app/api/transit.ts
parentb2ddc0ef449ccbe7f0d33e539ccdfc1baef04e2c (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.ts39
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);
+};