Miscellaneous fixes (#22828)

* fix video playback stutter when GenAI dialog is open in detail stream

Inline `onOpen` callback in DetailStream.tsx:522 creates a new function identity every render. GenAISummaryChip.tsx:98's useEffect depends on [open, onOpen], so it re-fires on every parent re-render while the dialog is open. Each fire calls onSeek -> setCurrentTime -> seekToTimestamp, creating a continuous re-render + seek loop

* add /profiles to EXEMPT_PATHS for non-admin users

* skip debug_replay/status poll for non-admin users

* use subquery for timeline lookup to avoid SQLite variable limit
This commit is contained in:
Josh Hawkins
2026-04-09 21:53:17 -05:00
committed by GitHub
parent d113be5e19
commit 335229d0d4
4 changed files with 20 additions and 12 deletions

View File

@@ -6,7 +6,7 @@ import {
ThreatLevel,
THREAT_LEVEL_LABELS,
} from "@/types/review";
import React, { useEffect, useMemo, useState } from "react";
import React, { useEffect, useMemo, useRef, useState } from "react";
import { isDesktop } from "react-device-detect";
import { useTranslation } from "react-i18next";
import { MdAutoAwesome } from "react-icons/md";
@@ -95,11 +95,12 @@ export function GenAISummaryDialog({
const Trigger = isDesktop ? DialogTrigger : DrawerTrigger;
const Content = isDesktop ? DialogContent : DrawerContent;
const onOpenRef = useRef(onOpen);
onOpenRef.current = onOpen;
useEffect(() => {
if (onOpen) {
onOpen(open);
}
}, [open, onOpen]);
onOpenRef.current?.(open);
}, [open]);
if (!aiAnalysis) {
return null;

View File

@@ -11,15 +11,20 @@ import useDeepMemo from "./use-deep-memo";
import { capitalizeAll, capitalizeFirstLetter } from "@/utils/stringUtil";
import { isReplayCamera } from "@/utils/cameraUtil";
import { useFrigateStats } from "@/api/ws";
import { useIsAdmin } from "./use-is-admin";
import { useTranslation } from "react-i18next";
export default function useStats(stats: FrigateStats | undefined) {
const { t } = useTranslation(["views/system"]);
const { data: config } = useSWR<FrigateConfig>("config");
const { data: debugReplayStatus } = useSWR("debug_replay/status", {
revalidateOnFocus: false,
});
const isAdmin = useIsAdmin();
const { data: debugReplayStatus } = useSWR(
isAdmin ? "debug_replay/status" : null,
{
revalidateOnFocus: false,
},
);
const memoizedStats = useDeepMemo(stats);