diff --git a/frigate/api/auth.py b/frigate/api/auth.py index d3d5a9c5d..a7edb6ad4 100644 --- a/frigate/api/auth.py +++ b/frigate/api/auth.py @@ -64,6 +64,7 @@ def require_admin_by_default(): "/logout", # Authenticated user endpoints (allow_any_authenticated) "/profile", + "/profiles", # Public info endpoints (allow_public) "/", "/version", diff --git a/frigate/util/object.py b/frigate/util/object.py index 7f38438f4..7c7edc10c 100644 --- a/frigate/util/object.py +++ b/frigate/util/object.py @@ -62,11 +62,12 @@ def get_camera_regions_grid( .where((Event.false_positive == None) | (Event.false_positive == False)) .where(Event.start_time > last_update) ) - valid_event_ids = [e["id"] for e in events.dicts()] - logger.debug(f"Found {len(valid_event_ids)} new events for {name}") + + event_count = events.count() + logger.debug(f"Found {event_count} new events for {name}") # no new events, return as is - if not valid_event_ids: + if event_count == 0: return grid new_update = datetime.datetime.now().timestamp() @@ -78,7 +79,7 @@ def get_camera_regions_grid( Timeline.data, ] ) - .where(Timeline.source_id << valid_event_ids) + .where(Timeline.source_id << events) .limit(10000) .dicts() ) diff --git a/web/src/components/overlay/chip/GenAISummaryChip.tsx b/web/src/components/overlay/chip/GenAISummaryChip.tsx index b056c36b2..edfa74f39 100644 --- a/web/src/components/overlay/chip/GenAISummaryChip.tsx +++ b/web/src/components/overlay/chip/GenAISummaryChip.tsx @@ -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; diff --git a/web/src/hooks/use-stats.ts b/web/src/hooks/use-stats.ts index bfb3bafd8..1fd966aa6 100644 --- a/web/src/hooks/use-stats.ts +++ b/web/src/hooks/use-stats.ts @@ -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("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);