diff --git a/web/src/pages/Events.tsx b/web/src/pages/Events.tsx index e54482cf1..58b3f4bdd 100644 --- a/web/src/pages/Events.tsx +++ b/web/src/pages/Events.tsx @@ -10,6 +10,7 @@ import { ReviewSegment, ReviewSeverity, ReviewSummary, + SegmentedReviewData, } from "@/types/review"; import { getTimestampOffset } from "@/utils/dateUtil"; import EventView from "@/views/events/EventView"; @@ -138,6 +139,66 @@ export default function Events() { }, ); + const reviewItems = useMemo(() => { + if (!reviews) { + return undefined; + } + + const all: ReviewSegment[] = []; + const alerts: ReviewSegment[] = []; + const detections: ReviewSegment[] = []; + const motion: ReviewSegment[] = []; + + reviews?.forEach((segment) => { + all.push(segment); + + switch (segment.severity) { + case "alert": + alerts.push(segment); + break; + case "detection": + detections.push(segment); + break; + default: + motion.push(segment); + break; + } + }); + + return { + all: all, + alert: alerts, + detection: detections, + significant_motion: motion, + }; + }, [reviews]); + + const currentItems = useMemo(() => { + if (!reviewItems || !severity) { + return null; + } + + let current; + + if (reviewFilter?.showAll) { + current = reviewItems.all; + } else { + current = reviewItems[severity]; + } + + if (!current || current.length == 0) { + return []; + } + + if (reviewFilter?.showReviewed != 1) { + return current.filter((seg) => !seg.has_been_reviewed); + } else { + return current; + } + // only refresh when severity or filter changes + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [severity, reviewFilter, reviewItems?.all.length]); + // review summary const { data: reviewSummary, mutate: updateSummary } = useSWR( @@ -353,7 +414,8 @@ export default function Events() { } else { return ( void; }; export default function EventView({ - reviews, + reviewItems, + currentReviewItems, reviewSummary, relevantPreviews, timeRange, @@ -116,42 +119,6 @@ export default function EventView({ } }, [filter, reviewSummary]); - // review paging - - const reviewItems = useMemo(() => { - if (!reviews) { - return undefined; - } - - const all: ReviewSegment[] = []; - const alerts: ReviewSegment[] = []; - const detections: ReviewSegment[] = []; - const motion: ReviewSegment[] = []; - - reviews?.forEach((segment) => { - all.push(segment); - - switch (segment.severity) { - case "alert": - alerts.push(segment); - break; - case "detection": - detections.push(segment); - break; - default: - motion.push(segment); - break; - } - }); - - return { - all: all, - alert: alerts, - detection: detections, - significant_motion: motion, - }; - }, [reviews]); - // review interaction const [selectedReviews, setSelectedReviews] = useState([]); @@ -182,6 +149,7 @@ export default function EventView({ severity: review.severity, }); + review.has_been_reviewed = true; markItemAsReviewed(review); } }, @@ -332,6 +300,7 @@ export default function EventView({ { - if (!reviewItems) { - return null; - } - - let current; - - if (filter?.showAll) { - current = reviewItems.all; - } else { - current = reviewItems[severity]; - } - - if (!current || current.length == 0) { - return []; - } - - if (filter?.showReviewed != 1) { - return current.filter((seg) => !seg.has_been_reviewed); - } else { - return current; - } - // only refresh when severity or filter changes - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [severity, filter, reviewItems?.all.length]); - // preview const [previewTime, setPreviewTime] = useState();