34 lines
1 KiB
TypeScript
34 lines
1 KiB
TypeScript
import { useState, useEffect } from 'react';
|
|
import { logNonAbortError } from '../lib/api';
|
|
import type { TransportMode } from './useTravelTime';
|
|
|
|
interface TravelModeInfo {
|
|
mode: TransportMode;
|
|
destinations: number;
|
|
}
|
|
|
|
/** Fetches which transport modes have precomputed travel time data. */
|
|
export function useTravelModes() {
|
|
const [availableModes, setAvailableModes] = useState<Set<TransportMode> | null>(null);
|
|
|
|
useEffect(() => {
|
|
const controller = new AbortController();
|
|
|
|
fetch('/api/travel-modes', { signal: controller.signal })
|
|
.then((res) => {
|
|
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
return res.json();
|
|
})
|
|
.then((data: { modes: TravelModeInfo[] }) => {
|
|
const modes = new Set<TransportMode>(
|
|
data.modes.filter((m) => m.destinations > 0).map((m) => m.mode)
|
|
);
|
|
setAvailableModes(modes);
|
|
})
|
|
.catch((err) => logNonAbortError('travel modes', err));
|
|
|
|
return () => controller.abort();
|
|
}, []);
|
|
|
|
return availableModes;
|
|
}
|