import { h } from 'preact'; import { ApiHost } from './context'; import Box from './components/Box'; import Heading from './components/Heading'; import Link from './components/Link'; import { route } from 'preact-router'; import { Table, Thead, Tbody, Tfoot, Th, Tr, Td } from './components/Table'; import { useCallback, useContext, useEffect, useState } from 'preact/hooks'; export default function Events({ url } = {}) { const apiHost = useContext(ApiHost); const [events, setEvents] = useState([]); const searchParams = new URL(`${window.location.protocol}//${window.location.host}${url || '/events'}`).searchParams; const searchParamsString = searchParams.toString(); useEffect(async () => { const response = await fetch(`${apiHost}/api/events?${searchParamsString}`); const data = response.ok ? await response.json() : {}; setEvents(data); }, [searchParamsString]); const searchKeys = Array.from(searchParams.keys()); return (
Events {searchKeys.length ? ( Filters
{searchKeys.map((filterKey) => ( ))}
) : null} {events.map( ( { camera, id, label, start_time: startTime, end_time: endTime, thumbnail, top_score: score, zones }, i ) => { const start = new Date(parseInt(startTime * 1000, 10)); const end = new Date(parseInt(endTime * 1000, 10)); return ( ); } )}
Camera Label Score Zones Date Start End
{(score * 100).toFixed(2)}%
    {zones.map((zone) => (
  • ))}
{start.toLocaleDateString()} {start.toLocaleTimeString()} {end.toLocaleTimeString()}
); } function Filterable({ searchParams, paramName, name }) { const params = new URLSearchParams(searchParams); params.set(paramName, name); return {name}; } function UnFilterable({ searchParams, paramName, name }) { const params = new URLSearchParams(searchParams); params.delete(paramName); return ( {name} ); }