Update ready when new review is saved

This commit is contained in:
Nicolas Mowen 2024-02-26 15:15:10 -07:00
parent e34670fedc
commit 5b6888cc78
3 changed files with 28 additions and 12 deletions

View File

@ -1,7 +1,7 @@
import { useFrigateEvents } from "@/api/ws"; import { useFrigateReviews } from "@/api/ws";
import useApiFilter from "@/hooks/use-api-filter"; import useApiFilter from "@/hooks/use-api-filter";
import useOverlayState from "@/hooks/use-overlay-state"; import useOverlayState from "@/hooks/use-overlay-state";
import { ReviewFilter, ReviewSegment } from "@/types/review"; import { ReviewFilter, ReviewSegment, ReviewSeverity } from "@/types/review";
import DesktopEventView from "@/views/events/DesktopEventView"; import DesktopEventView from "@/views/events/DesktopEventView";
import DesktopRecordingView from "@/views/events/DesktopRecordingView"; import DesktopRecordingView from "@/views/events/DesktopRecordingView";
import MobileEventView from "@/views/events/MobileEventView"; import MobileEventView from "@/views/events/MobileEventView";
@ -15,6 +15,8 @@ const API_LIMIT = 250;
export default function Events() { export default function Events() {
// recordings viewer // recordings viewer
const [severity, setSeverity] = useState<ReviewSeverity>("alert");
const [selectedReviewId, setSelectedReviewId] = useOverlayState("review"); const [selectedReviewId, setSelectedReviewId] = useOverlayState("review");
// review filter // review filter
@ -97,6 +99,11 @@ export default function Events() {
setSize(size + 1); setSize(size + 1);
}, [size]); }, [size]);
const reloadData = useCallback(() => {
setSize(1);
updateSegments();
}, [])
// preview videos // preview videos
const previewTimes = useMemo(() => { const previewTimes = useMemo(() => {
@ -196,22 +203,21 @@ export default function Events() {
// review updates // review updates
const { payload: eventUpdate } = useFrigateEvents(); const { payload: reviewUpdate } = useFrigateReviews();
const [hasUpdate, setHasUpdate] = useState(false); const [hasUpdate, setHasUpdate] = useState(false);
useEffect(() => { useEffect(() => {
if (!eventUpdate) { if (!reviewUpdate || hasUpdate) {
return; return;
} }
// if event is ended and was saved, update events list
if ( if (
eventUpdate.type == "end" && reviewUpdate.type == "end" &&
(eventUpdate.after.has_clip || eventUpdate.after.has_snapshot) reviewUpdate.review.severity == severity
) { ) {
setHasUpdate(true); setHasUpdate(true);
return; return;
} }
}, [eventUpdate]); }, [reviewUpdate]);
if (selectedData) { if (selectedData) {
return ( return (
@ -229,11 +235,13 @@ export default function Events() {
relevantPreviews={allPreviews} relevantPreviews={allPreviews}
reachedEnd={isDone} reachedEnd={isDone}
isValidating={isValidating} isValidating={isValidating}
severity={severity}
hasUpdate={hasUpdate} hasUpdate={hasUpdate}
setSeverity={setSeverity}
setHasUpdate={setHasUpdate} setHasUpdate={setHasUpdate}
loadNextPage={onLoadNextPage} loadNextPage={onLoadNextPage}
markItemAsReviewed={markItemAsReviewed} markItemAsReviewed={markItemAsReviewed}
pullLatestData={updateSegments} pullLatestData={reloadData}
/> />
); );
} }
@ -246,13 +254,15 @@ export default function Events() {
reachedEnd={isDone} reachedEnd={isDone}
isValidating={isValidating} isValidating={isValidating}
filter={reviewFilter} filter={reviewFilter}
severity={severity}
hasUpdate={hasUpdate} hasUpdate={hasUpdate}
setSeverity={setSeverity}
setHasUpdate={setHasUpdate} setHasUpdate={setHasUpdate}
loadNextPage={onLoadNextPage} loadNextPage={onLoadNextPage}
markItemAsReviewed={markItemAsReviewed} markItemAsReviewed={markItemAsReviewed}
onSelectReview={setSelectedReviewId} onSelectReview={setSelectedReviewId}
pullLatestData={updateSegments} pullLatestData={updateSegments}
updateFilter={onUpdateFilter} updateFilter={reloadData}
/> />
); );
} }

View File

@ -18,7 +18,9 @@ type DesktopEventViewProps = {
reachedEnd: boolean; reachedEnd: boolean;
isValidating: boolean; isValidating: boolean;
filter?: ReviewFilter; filter?: ReviewFilter;
severity: ReviewSeverity;
hasUpdate: boolean; hasUpdate: boolean;
setSeverity: (severity: ReviewSeverity) => void;
setHasUpdate: (hasUpdated: boolean) => void; setHasUpdate: (hasUpdated: boolean) => void;
loadNextPage: () => void; loadNextPage: () => void;
markItemAsReviewed: (reviewId: string) => void; markItemAsReviewed: (reviewId: string) => void;
@ -33,7 +35,9 @@ export default function DesktopEventView({
reachedEnd, reachedEnd,
isValidating, isValidating,
filter, filter,
severity,
hasUpdate, hasUpdate,
setSeverity,
setHasUpdate, setHasUpdate,
loadNextPage, loadNextPage,
markItemAsReviewed, markItemAsReviewed,
@ -42,7 +46,6 @@ export default function DesktopEventView({
updateFilter, updateFilter,
}: DesktopEventViewProps) { }: DesktopEventViewProps) {
const { data: config } = useSWR<FrigateConfig>("config"); const { data: config } = useSWR<FrigateConfig>("config");
const [severity, setSeverity] = useState<ReviewSeverity>("alert");
const contentRef = useRef<HTMLDivElement | null>(null); const contentRef = useRef<HTMLDivElement | null>(null);
// review paging // review paging

View File

@ -14,7 +14,9 @@ type MobileEventViewProps = {
relevantPreviews?: Preview[]; relevantPreviews?: Preview[];
reachedEnd: boolean; reachedEnd: boolean;
isValidating: boolean; isValidating: boolean;
severity: ReviewSeverity;
hasUpdate: boolean; hasUpdate: boolean;
setSeverity: (severity: ReviewSeverity) => void;
setHasUpdate: (hasUpdated: boolean) => void; setHasUpdate: (hasUpdated: boolean) => void;
loadNextPage: () => void; loadNextPage: () => void;
markItemAsReviewed: (reviewId: string) => void; markItemAsReviewed: (reviewId: string) => void;
@ -25,14 +27,15 @@ export default function MobileEventView({
relevantPreviews, relevantPreviews,
reachedEnd, reachedEnd,
isValidating, isValidating,
severity,
hasUpdate, hasUpdate,
setSeverity,
setHasUpdate, setHasUpdate,
loadNextPage, loadNextPage,
markItemAsReviewed, markItemAsReviewed,
pullLatestData, pullLatestData,
}: MobileEventViewProps) { }: MobileEventViewProps) {
const { data: config } = useSWR<FrigateConfig>("config"); const { data: config } = useSWR<FrigateConfig>("config");
const [severity, setSeverity] = useState<ReviewSeverity>("alert");
const contentRef = useRef<HTMLDivElement | null>(null); const contentRef = useRef<HTMLDivElement | null>(null);
// review paging // review paging