aboutsummaryrefslogtreecommitdiff
path: root/src/frontend/app/data/PlannerApi.ts
blob: df504ada592f514b3b4cca6fa85996c9e3f5fbd5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
export interface PlannerSearchResult {
  name?: string;
  label?: string;
  lat: number;
  lon: number;
  layer?: string;
}

export interface RoutePlan {
  itineraries: Itinerary[];
  timeOffsetSeconds?: number;
}

export interface Itinerary {
  durationSeconds: number;
  startTime: string;
  endTime: string;
  walkDistanceMeters: number;
  walkTimeSeconds: number;
  transitTimeSeconds: number;
  waitingTimeSeconds: number;
  legs: Leg[];
  cashFareEuro?: number;
  cardFareEuro?: number;
}

export interface Leg {
  mode?: string;
  routeName?: string;
  routeShortName?: string;
  routeLongName?: string;
  headsign?: string;
  agencyName?: string;
  from?: PlannerPlace;
  to?: PlannerPlace;
  startTime: string;
  endTime: string;
  distanceMeters: number;
  geometry?: PlannerGeometry;
  steps: Step[];
}

export interface PlannerPlace {
  name?: string;
  lat: number;
  lon: number;
  stopId?: string;
  stopCode?: string;
}

export interface PlannerGeometry {
  type: string;
  coordinates: number[][];
}

export interface Step {
  distanceMeters: number;
  relativeDirection?: string;
  absoluteDirection?: string;
  streetName?: string;
  lat: number;
  lon: number;
}

export async function searchPlaces(
  query: string
): Promise<PlannerSearchResult[]> {
  const response = await fetch(
    `/api/planner/autocomplete?query=${encodeURIComponent(query)}`
  );
  if (!response.ok) return [];
  return response.json();
}

export async function reverseGeocode(
  lat: number,
  lon: number
): Promise<PlannerSearchResult | null> {
  const response = await fetch(`/api/planner/reverse?lat=${lat}&lon=${lon}`);
  if (!response.ok) return null;
  return response.json();
}

export async function planRoute(
  fromLat: number,
  fromLon: number,
  toLat: number,
  toLon: number,
  time?: Date,
  arriveBy: boolean = false
): Promise<RoutePlan> {
  let url = `/api/planner/plan?fromLat=${fromLat}&fromLon=${fromLon}&toLat=${toLat}&toLon=${toLon}&arriveBy=${arriveBy}`;
  if (time) {
    url += `&time=${time.toISOString()}`;
  }
  const response = await fetch(url);
  if (!response.ok) throw new Error("Failed to plan route");
  return response.json();
}