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:
Josh Hawkins 2026-04-15 09:24:36 -05:00 committed by GitHub
parent 15ac76f20d
commit 82e14d71fb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -24,6 +24,7 @@ import {
import EventView from "@/views/events/EventView"; import EventView from "@/views/events/EventView";
import MotionSearchView from "@/views/motion-search/MotionSearchView"; import MotionSearchView from "@/views/motion-search/MotionSearchView";
import { RecordingView } from "@/views/recording/RecordingView"; import { RecordingView } from "@/views/recording/RecordingView";
import { useFrigateReviews } from "@/api/ws";
import axios from "axios"; import axios from "axios";
import { useCallback, useEffect, useMemo, useState } from "react"; import { useCallback, useEffect, useMemo, useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
@ -326,6 +327,29 @@ export default function Events() {
}; };
}, [reviews]); }, [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(() => { const currentItems = useMemo(() => {
if (!reviewItems || !severity) { if (!reviewItems || !severity) {
return null; return null;
@ -352,6 +376,13 @@ export default function Events() {
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [severity, reviewFilter, showReviewed, reviewItems?.all.length]); }, [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 // review summary
const { data: reviewSummary, mutate: updateSummary } = useSWR<ReviewSummary>( const { data: reviewSummary, mutate: updateSummary } = useSWR<ReviewSummary>(
@ -603,7 +634,7 @@ export default function Events() {
) : ( ) : (
<EventView <EventView
reviewItems={reviewItems} reviewItems={reviewItems}
currentReviewItems={currentItems} currentReviewItems={displayItems}
reviewSummary={reviewSummary} reviewSummary={reviewSummary}
recordingsSummary={recordingsSummary} recordingsSummary={recordingsSummary}
relevantPreviews={allPreviews} relevantPreviews={allPreviews}