import { useCallback, useEffect, useMemo, useState } from "react"; import type { SightingType, SightingWidgetType } from "../../types/types"; import { BLANK_IMG } from "../../utils/utils"; import NumberPlate from "../PlateStack/NumberPlate"; import Card from "../UI/Card"; import CardHeader from "../UI/CardHeader"; import clsx from "clsx"; import { useSightingFeedContext } from "../../context/SightingFeedContext"; import SightingModal from "../SightingModal/SightingModal"; import { useAlertHitContext } from "../../context/AlertHitContext"; import InfoBar from "./InfoBar"; function useNow(tickMs = 1000) { const [, setNow] = useState(() => Date.now()); useEffect(() => { const id = setInterval(() => setNow(Date.now()), tickMs); return () => clearInterval(id); }, [tickMs]); return undefined; } type SightingHistoryProps = { baseUrl?: string; entries?: number; // number of rows to show pollMs?: number; // poll frequency autoSelectLatest?: boolean; title: string; className: React.HTMLAttributes | string; }; // /type SightingHistoryWidgetProps = React.HTMLAttributes; export default function SightingHistoryWidget({ className, title, }: SightingHistoryProps) { useNow(1000); const { sightings, setSelectedSighting, setSightingModalOpen, isSightingModalOpen, selectedSighting, } = useSightingFeedContext(); const { disptach } = useAlertHitContext(); const onRowClick = useCallback( (sighting: SightingType | SightingWidgetType) => { if (!sighting) return; setSightingModalOpen(!isSightingModalOpen); setSelectedSighting(sighting); }, [isSightingModalOpen, setSelectedSighting, setSightingModalOpen] ); const rows = useMemo( () => sightings?.filter(Boolean) as SightingWidgetType[], [sightings] ); useEffect(() => { rows?.forEach((obj) => { const isNPEDHit = obj?.metadata?.npedJSON?.status_code === 404; if (isNPEDHit) { disptach({ type: "ADD", payload: obj, }); } }); }, [rows, disptach]); const handleClose = () => { setSightingModalOpen(false); }; return ( <>
{/* Rows */}
{rows?.map((obj, idx) => { const isNPEDHit = obj?.metadata?.npedJSON?.status_code === 404; const motionAway = (obj?.motion ?? "").toUpperCase() === "AWAY"; const primaryIsColour = obj?.srcCam === 1; const secondaryMissing = (obj?.vrmSecondary ?? "") === ""; return (
onRowClick(obj)} > {/* Info bar */} {/* Patch row */}
{obj?.plateUrlInfrared && (
infrared patch
)}
colour patch
); })}
); }