diff --git a/web/src/pages/Events.tsx b/web/src/pages/Events.tsx index 472bb2463..93649b7c6 100644 --- a/web/src/pages/Events.tsx +++ b/web/src/pages/Events.tsx @@ -1,14 +1,47 @@ +import TimeAgo from "@/components/dynamic/TimeAgo"; +import ActivityIndicator from "@/components/ui/activity-indicator"; import { Button } from "@/components/ui/button"; import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"; -import { useState } from "react"; +import { FrigateConfig } from "@/types/frigateConfig"; +import { ReviewSegment, ReviewSeverity } from "@/types/review"; +import { formatUnixTimestampToDateTime } from "@/utils/dateUtil"; +import { useMemo, useState } from "react"; import { LuCalendar, LuFilter, LuVideo } from "react-icons/lu"; import { MdCircle } from "react-icons/md"; - -type ReviewSeverity = "alert" | "detection" | "significant_motion"; +import useSWR from "swr"; export default function Events() { + const { data: config } = useSWR("config"); const [severity, setSeverity] = useState("alert"); + const { data: reviewSegments } = useSWR("review"); + + const previewTimes = useMemo(() => { + if (!reviewSegments) { + return undefined; + } + + const startDate = new Date(); + startDate.setMinutes(0, 0, 0); + + const endDate = new Date(reviewSegments.at(-1)!!.end_time); + endDate.setHours(0, 0, 0, 0); + return { + start: startDate.getTime() / 1000, + end: endDate.getTime() / 1000, + }; + }, [reviewSegments]); + const { data: allPreviews } = useSWR( + previewTimes + ? `preview/all/start/${previewTimes.start}/end/${previewTimes.end}` + : null, + { revalidateOnFocus: false } + ); + + if (!config) { + return ; + } + return ( <>
@@ -64,6 +97,27 @@ export default function Events() {
+ +
+ {reviewSegments?.map((value) => { + if (value.severity == severity) { + return ( +
+ {value.camera} {value.data.objects} +
+ + {formatUnixTimestampToDateTime(value.start_time, { + strftime_fmt: + config.ui.time_format == "24hour" + ? "%b %-d, %H:%M" + : "%b %-d, %I:%M %p", + })} +
+
+ ); + } + })} +
); } diff --git a/web/src/types/review.ts b/web/src/types/review.ts index 16dc2defa..2f55ddace 100644 --- a/web/src/types/review.ts +++ b/web/src/types/review.ts @@ -1,20 +1,20 @@ export interface ReviewSegment { - id: string; - camera: string; - severity: ReviewSeverity; - start_time: number; - end_time: number; - thumb_path: string; - has_been_reviewed: boolean; - data: ReviewData; - } + id: string; + camera: string; + severity: ReviewSeverity; + start_time: number; + end_time: number; + thumb_path: string; + has_been_reviewed: boolean; + data: ReviewData; +} - export type ReviewSeverity = "alert" | "detection" | "significant_motion"; +export type ReviewSeverity = "alert" | "detection" | "significant_motion"; - export type ReviewData = { - audio: string[]; - detections: string[]; - objects: string[]; - significant_motion_areas: number[]; - zones: string[]; - }; \ No newline at end of file +type ReviewData = { + audio: string[]; + detections: string[]; + objects: string[]; + significant_motion_areas: number[]; + zones: string[]; +};