ahbeng/NUSMods

View on GitHub
website/src/apis/nextbus.ts

Summary

Maintainability
A
0 mins
Test Coverage
import axios from 'axios';

import { NextBus, NextBusTime, NextBusTimings } from 'types/venues';

const baseUrl = 'https://nextbus.nusmods.com';

interface ShuttleServiceResult {
  caption: string;
  name: string;
  shuttles: Shuttle[];
}

interface Shuttle {
  arrivalTime: string;
  name: string;
  nextArrivalTime: string;
  nextPassengers: string;
  passengers: string;
}

function convertArrivalTime(arrivalTime: string): NextBusTime {
  const numericTime = +arrivalTime;
  if (!Number.isNaN(numericTime)) return numericTime;
  if (arrivalTime === 'Arr' || arrivalTime === '-') return arrivalTime;
  throw new Error(`Unknown arrival time ${arrivalTime}`);
}

export function nextBus(code: string): Promise<NextBusTimings> {
  const url = `${baseUrl}/arrival`;
  return axios
    .get<{
      ShuttleServiceResult: ShuttleServiceResult;
    }>(url, { params: { busstopname: code } })
    .then((response) => {
      const shuttles: NextBusTimings = {};

      response.data.ShuttleServiceResult.shuttles.forEach((arrival: Shuttle) => {
        const timing: NextBus = {
          arrivalTime: convertArrivalTime(arrival.arrivalTime),
          nextArrivalTime: convertArrivalTime(arrival.nextArrivalTime),
        };

        shuttles[arrival.name] = timing;
      });

      return shuttles;
    });
}