mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-05-01 19:17:41 +03: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:
parent
15ac76f20d
commit
82e14d71fb
@ -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}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user