api/stopEvent.ts (view raw)
1import { difference } from "@std/datetime/difference";
2import { format } from "@std/datetime/format";
3import { getStopEventService } from "./api.ts";
4import { get } from "../lib/func.ts";
5
6export const getNextDepartures = async (
7 stopRef: string,
8 depArrTime: Date = new Date()
9): Promise<StopEvent[]> => {
10 const { result } = await getStopEventService(stopRef, depArrTime);
11 const stopEventResult =
12 result.OJP.OJPResponse["siri:ServiceDelivery"]["OJPStopEventDelivery"][
13 "StopEventResult"
14 ];
15
16 return stopEventResult
17 .map((stopEvent: any) => {
18 const rawDatetime =
19 get(
20 stopEvent,
21 "StopEvent.ThisCall.CallAtStop.ServiceDeparture.EstimatedTime"
22 ) ||
23 get(
24 stopEvent,
25 "StopEvent.ThisCall.CallAtStop.ServiceDeparture.TimetabledTime"
26 );
27 let datetime = null;
28 let departureIn = null;
29 if (rawDatetime) {
30 datetime = new Date(rawDatetime);
31 departureIn = difference(datetime, new Date(), { units: ["minutes"] });
32 }
33 return {
34 from: get(stopEvent, "StopEvent.Service.OriginText.Text.#text"),
35 to: get(stopEvent, "StopEvent.Service.DestinationText.Text.#text"),
36 departure: datetime && format(datetime, "HH:mm"),
37 departureIn: departureIn?.minutes,
38 stopName: get(
39 stopEvent,
40 "StopEvent.ThisCall.CallAtStop.StopPointName.Text.#text"
41 ),
42 quay: get(
43 stopEvent,
44 "StopEvent.ThisCall.CallAtStop.PlannedQuay.Text.#text"
45 ),
46 } as StopEvent;
47 })
48 .sort(
49 (eventA: StopEvent, eventB: StopEvent) =>
50 eventA.departureIn - eventB.departureIn
51 );
52};