diff --git a/web/src/components/camera/DebugCameraImage.tsx b/web/src/components/camera/DebugCameraImage.tsx index e7352c17a..34588aa06 100644 --- a/web/src/components/camera/DebugCameraImage.tsx +++ b/web/src/components/camera/DebugCameraImage.tsx @@ -22,7 +22,7 @@ export default function DebugCameraImage({ cameraConfig, }: DebugCameraImageProps) { const [showSettings, setShowSettings] = useState(false); - const [options, setOptions] = usePersistence( + const [options, setOptions] = usePersistence( `${cameraConfig?.name}-feed`, emptyObject ); @@ -36,7 +36,7 @@ export default function DebugCameraImage({ const searchParams = useMemo( () => new URLSearchParams( - Object.keys(options).reduce((memo, key) => { + Object.keys(options || {}).reduce((memo, key) => { //@ts-ignore we know this is correct memo.push([key, options[key] === true ? "1" : "0"]); return memo; @@ -68,7 +68,7 @@ export default function DebugCameraImage({ diff --git a/web/src/hooks/use-camera-live-mode.ts b/web/src/hooks/use-camera-live-mode.ts index 214713dc1..f13622556 100644 --- a/web/src/hooks/use-camera-live-mode.ts +++ b/web/src/hooks/use-camera-live-mode.ts @@ -7,7 +7,7 @@ import { LivePlayerMode } from "@/types/live"; export default function useCameraLiveMode( cameraConfig: CameraConfig, preferredMode?: string -): LivePlayerMode { +): LivePlayerMode | undefined { const { data: config } = useSWR("config"); const restreamEnabled = useMemo(() => { @@ -22,10 +22,10 @@ export default function useCameraLiveMode( ) ); }, [config, cameraConfig]); - const defaultLiveMode = useMemo(() => { + const defaultLiveMode = useMemo(() => { if (config && cameraConfig) { if (restreamEnabled) { - return cameraConfig.ui.live_mode || config?.ui.live_mode; + return cameraConfig.ui.live_mode || config.ui.live_mode; } return "jsmpeg"; @@ -33,7 +33,7 @@ export default function useCameraLiveMode( return undefined; }, [cameraConfig, restreamEnabled]); - const [viewSource] = usePersistence( + const [viewSource] = usePersistence( `${cameraConfig.name}-source`, defaultLiveMode ); diff --git a/web/src/hooks/use-persistence.ts b/web/src/hooks/use-persistence.ts index 48a03d7e1..3d61cfa17 100644 --- a/web/src/hooks/use-persistence.ts +++ b/web/src/hooks/use-persistence.ts @@ -1,21 +1,21 @@ import { useEffect, useState, useCallback } from "react"; import { get as getData, set as setData } from "idb-keyval"; -type usePersistenceReturn = [ - value: any | undefined, - setValue: (value: string | boolean) => void, +type usePersistenceReturn = [ + value: S | undefined, + setValue: (value: S) => void, loaded: boolean, ]; -export function usePersistence( +export function usePersistence( key: string, - defaultValue: any | undefined = undefined -): usePersistenceReturn { - const [value, setInternalValue] = useState(defaultValue); + defaultValue: S | undefined = undefined +): usePersistenceReturn { + const [value, setInternalValue] = useState(defaultValue); const [loaded, setLoaded] = useState(false); const setValue = useCallback( - (value: string | boolean) => { + (value: S) => { setInternalValue(value); async function update() { await setData(key, value); diff --git a/web/src/pages/Live.tsx b/web/src/pages/Live.tsx index cb6ada236..e4c9f71a2 100644 --- a/web/src/pages/Live.tsx +++ b/web/src/pages/Live.tsx @@ -5,6 +5,7 @@ import LivePlayer from "@/components/player/LivePlayer"; import { Button } from "@/components/ui/button"; import { ScrollArea, ScrollBar } from "@/components/ui/scroll-area"; import { TooltipProvider } from "@/components/ui/tooltip"; +import { usePersistence } from "@/hooks/use-persistence"; import { Event as FrigateEvent } from "@/types/event"; import { FrigateConfig } from "@/types/frigateConfig"; import { useCallback, useEffect, useMemo, useState } from "react"; @@ -17,7 +18,8 @@ function Live() { // layout - const [layout, setLayout] = useState<"grid" | "list">( + const [layout, setLayout] = usePersistence<"grid" | "list">( + "live-layout", isDesktop ? "grid" : "list" ); diff --git a/web/src/types/frigateConfig.ts b/web/src/types/frigateConfig.ts index 77c51c879..5149264d8 100644 --- a/web/src/types/frigateConfig.ts +++ b/web/src/types/frigateConfig.ts @@ -1,10 +1,12 @@ +import { LivePlayerMode } from "./live"; + export interface UiConfig { timezone?: string; time_format?: "browser" | "12hour" | "24hour"; date_style?: "full" | "long" | "medium" | "short"; time_style?: "full" | "long" | "medium" | "short"; strftime_fmt?: string; - live_mode?: string; + live_mode?: LivePlayerMode; use_experimental?: boolean; dashboard: boolean; order: number;