import { h, Fragment } from 'preact'; import { useCallback, useState, useEffect } from 'preact/hooks'; import Link from '../components/Link'; import ActivityIndicator from '../components/ActivityIndicator'; import Button from '../components/Button'; import ArrowDown from '../icons/ArrowDropdown'; import ArrowDropup from '../icons/ArrowDropup'; import Clip from '../icons/Clip'; import Close from '../icons/Close'; import Delete from '../icons/Delete'; import Snapshot from '../icons/Snapshot'; import Dialog from '../components/Dialog'; import Heading from '../components/Heading'; import VideoPlayer from '../components/VideoPlayer'; import { Table, Thead, Tbody, Th, Tr, Td } from '../components/Table'; import { FetchStatus, useApiHost, useEvent, useDelete } from '../api'; const ActionButtonGroup = ({ className, handleClickDelete, close }) => (
); const DownloadButtonGroup = ({ className, apiHost, eventId }) => ( ); export default function Event({ eventId, close, scrollRef }) { const apiHost = useApiHost(); const { data, status } = useEvent(eventId); const [showDialog, setShowDialog] = useState(false); const [showDetails, setShowDetails] = useState(false); const [shouldScroll, setShouldScroll] = useState(true); const [deleteStatus, setDeleteStatus] = useState(FetchStatus.NONE); const setDeleteEvent = useDelete(); useEffect(() => { // Scroll event into view when component has been mounted. if (shouldScroll && scrollRef && scrollRef[eventId]) { scrollRef[eventId].scrollIntoView(); setShouldScroll(false); } return () => { // When opening new event window, the previous one will sometimes cause the // navbar to be visible, hence the "hide nav" code bellow. // Navbar will be hided if we add the - translate - y - full class.appBar.js const element = document.getElementById('appbar'); if (element) element.classList.add('-translate-y-full'); }; }, [data, scrollRef, eventId, shouldScroll]); const handleClickDelete = () => { setShowDialog(true); }; const handleDismissDeleteDialog = () => { setShowDialog(false); }; const handleClickDeleteDialog = useCallback(async () => { let success; try { success = await setDeleteEvent(eventId); setDeleteStatus(success ? FetchStatus.LOADED : FetchStatus.ERROR); } catch (e) { setDeleteStatus(FetchStatus.ERROR); } if (success) { setDeleteStatus(FetchStatus.LOADED); setShowDialog(false); } }, [eventId, setShowDialog, setDeleteEvent]); if (status !== FetchStatus.LOADED) { return ; } const startime = new Date(data.start_time * 1000); const endtime = new Date(data.end_time * 1000); return (
{showDialog ? ( ) : null}
{showDetails ? (
Key Value
Camera {data.camera}
Timeframe {startime.toLocaleString()} – {endtime.toLocaleString()}
Score {(data.top_score * 100).toFixed(2)}%
Zones {data.zones.join(', ')}
) : null}
{data.has_clip ? ( Clip {}} /> ) : ( {data.has_snapshot ? 'Best Image' : 'Thumbnail'} {`${data.label} )}
); }