mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-04-19 23:08:08 +02:00
Fix review page spinner not clearing when review item ends (#22886)
* fix review page spinner not clearing when review item ends * use last ended review item ID instead of counter * use separate displayItems memo to overlay end_time updates without re-filtering reviewed items
This commit is contained in:
@@ -24,6 +24,7 @@ import {
|
||||
import EventView from "@/views/events/EventView";
|
||||
import MotionSearchView from "@/views/motion-search/MotionSearchView";
|
||||
import { RecordingView } from "@/views/recording/RecordingView";
|
||||
import { useFrigateReviews } from "@/api/ws";
|
||||
import axios from "axios";
|
||||
import { useCallback, useEffect, useMemo, useState } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
@@ -326,6 +327,29 @@ export default function Events() {
|
||||
};
|
||||
}, [reviews]);
|
||||
|
||||
// update review items in place when a review segment ends
|
||||
const reviewUpdate = useFrigateReviews();
|
||||
const [endedReviews, setEndedReviews] = useState(
|
||||
new Map<string, ReviewSegment>(),
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
if (reviewUpdate?.type === "end") {
|
||||
updateSegments(
|
||||
(data) => {
|
||||
if (!data) return data;
|
||||
return data.map((seg) =>
|
||||
seg.id === reviewUpdate.after.id ? reviewUpdate.after : seg,
|
||||
);
|
||||
},
|
||||
{ revalidate: false, populateCache: true },
|
||||
);
|
||||
setEndedReviews((prev) =>
|
||||
new Map(prev).set(reviewUpdate.after.id, reviewUpdate.after),
|
||||
);
|
||||
}
|
||||
}, [reviewUpdate, updateSegments]);
|
||||
|
||||
const currentItems = useMemo(() => {
|
||||
if (!reviewItems || !severity) {
|
||||
return null;
|
||||
@@ -352,6 +376,13 @@ export default function Events() {
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [severity, reviewFilter, showReviewed, reviewItems?.all.length]);
|
||||
|
||||
// overlay end_time updates onto currentItems without re-running
|
||||
// the has_been_reviewed filter, so hover-reviewed items stay visible
|
||||
const displayItems = useMemo(() => {
|
||||
if (!currentItems || endedReviews.size === 0) return currentItems;
|
||||
return currentItems.map((seg) => endedReviews.get(seg.id) ?? seg);
|
||||
}, [currentItems, endedReviews]);
|
||||
|
||||
// review summary
|
||||
|
||||
const { data: reviewSummary, mutate: updateSummary } = useSWR<ReviewSummary>(
|
||||
@@ -603,7 +634,7 @@ export default function Events() {
|
||||
) : (
|
||||
<EventView
|
||||
reviewItems={reviewItems}
|
||||
currentReviewItems={currentItems}
|
||||
currentReviewItems={displayItems}
|
||||
reviewSummary={reviewSummary}
|
||||
recordingsSummary={recordingsSummary}
|
||||
relevantPreviews={allPreviews}
|
||||
|
||||
Reference in New Issue
Block a user