frigate/web-old/src/components/HistoryViewer/HistoryViewer.tsx

92 lines
2.7 KiB
TypeScript
Raw Normal View History

2022-02-27 17:04:12 +03:00
import { Fragment, h } from 'preact';
import { useCallback, useEffect, useState } from 'preact/hooks';
2022-02-26 22:11:00 +03:00
import useSWR from 'swr';
import axios from 'axios';
2022-02-27 17:04:12 +03:00
import Timeline from '../Timeline/Timeline';
2022-02-26 22:11:00 +03:00
import type { TimelineChangeEvent } from '../Timeline/TimelineChangeEvent';
import type { TimelineEvent } from '../Timeline/TimelineEvent';
2022-02-27 17:04:12 +03:00
import { HistoryHeader } from './HistoryHeader';
import { HistoryVideo } from './HistoryVideo';
2022-03-06 07:16:31 +03:00
export default function HistoryViewer({ camera }: {camera: string}) {
2022-02-26 22:11:00 +03:00
const searchParams = {
before: null,
after: null,
camera,
label: 'all',
zone: 'all',
};
// TODO: refactor
2022-03-06 07:16:31 +03:00
const eventsFetcher = (path: string, params: {[name:string]: string|number}) => {
2022-02-26 22:11:00 +03:00
params = { ...params, include_thumbnails: 0, limit: 500 };
2022-03-06 07:16:31 +03:00
return axios.get<TimelineEvent[]>(path, { params }).then((res) => res.data);
2022-02-26 22:11:00 +03:00
};
const { data: events } = useSWR(['events', searchParams], eventsFetcher);
2022-02-27 17:04:12 +03:00
2022-03-06 07:16:31 +03:00
const [timelineEvents, setTimelineEvents] = useState<TimelineEvent[]>([]);
const [currentEvent, setCurrentEvent] = useState<TimelineEvent>();
const [isPlaying, setIsPlaying] = useState<boolean>(false);
const [currentTime, setCurrentTime] = useState<number>(new Date().getTime());
2022-02-27 17:04:12 +03:00
useEffect(() => {
if (events) {
const filteredEvents = [...events].reverse().filter((e) => e.end_time !== undefined);
setTimelineEvents(filteredEvents);
}
}, [events]);
const handleTimelineChange = useCallback(
(event: TimelineChangeEvent) => {
if (event.seekComplete) {
setCurrentEvent(event.timelineEvent);
if (isPlaying && event.timelineEvent) {
const eventTime = (event.markerTime.getTime() - event.timelineEvent.startTime.getTime()) / 1000;
setCurrentTime(eventTime);
}
}
},
[isPlaying]
);
const onPlayHandler = () => {
setIsPlaying(true);
};
const onPausedHandler = () => {
setIsPlaying(false);
};
const onPlayPauseHandler = (isPlaying: boolean) => {
setIsPlaying(isPlaying);
};
return (
<Fragment>
<Fragment>
<div className='relative flex flex-col'>
<Fragment>
<HistoryHeader event={currentEvent} className='mb-2' />
<HistoryVideo
id={currentEvent ? currentEvent.id : undefined}
isPlaying={isPlaying}
currentTime={currentTime}
onPlay={onPlayHandler}
onPause={onPausedHandler}
/>
</Fragment>
</div>
</Fragment>
<Timeline
events={timelineEvents}
isPlaying={isPlaying}
onChange={handleTimelineChange}
onPlayPause={onPlayPauseHandler}
/>
</Fragment>
);
}