import { memo } from "preact/compat"; import { useEffect, useMemo, useState } from "preact/hooks"; import { twMerge } from "tailwind-merge"; import DebugStop from "../DebugStop/DebugStop"; import RouteStopDelay from "../RouteStopDelay"; import RouteStopProgress from "../RouteStopProgress"; import RouteStopStation from "../RouteStopStation"; import RouteStopTime from "../RouteStopTime"; import getStopStatus from "../utils/getStopStatus"; import useMapContext from "../utils/hooks/useMapContext"; import useRealtimeStation from "../utils/hooks/useRealtimeStation"; import { RouteStopContext } from "../utils/hooks/useRouteStop"; import type { RealtimeStop, RealtimeStopSequence, } from "mobility-toolbox-js/types"; import type { HTMLAttributes, PreactDOMAttributes } from "preact"; export type RouteScheduleStopProps = { classNameGreyOut?: string; index?: number; invertColor?: boolean; stop?: { platform?: string; } & RealtimeStop; stopSequence: RealtimeStopSequence; } & HTMLAttributes & PreactDOMAttributes; function RouteStop({ children, className, classNameGreyOut = "text-gray-600", index, invertColor = false, stop, stopSequence, ...props }: RouteScheduleStopProps) { const { map } = useMapContext(); const { stopUID } = stop; const [status, setStatus] = useState(getStopStatus(stopSequence, index)); const station = useRealtimeStation(stopUID); useEffect(() => { let interval = null; setStatus(getStopStatus(stopSequence, index)); // To see the progress bar we have to update the status of the vehicle until we get the new stopSeqeunce. if (status.isInBetween) { interval = setInterval(() => { setStatus(getStopStatus(stopSequence, index)); }, 1000); } return () => { clearInterval(interval); }; }, [index, status.isInBetween, stopSequence]); const routeStopState = useMemo(() => { return { index, invertColor, station, status, stop, stopSequence }; }, [stop, status, index, invertColor, station, stopSequence]); let colorScheme = status.isPassed || status.isLeft ? classNameGreyOut : ""; if (invertColor) { colorScheme = status.isPassed || status.isLeft || status.isBoarding ? "" : classNameGreyOut; } return ( ); } export default memo(RouteStop);