From fc256b0572638a51fd4f6e64bc0922c7ce54a9ca Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Fri, 2 Aug 2024 08:21:35 -0500 Subject: [PATCH] Persist live view muted/unmuted for session only --- web/src/hooks/use-session-state.ts | 39 +++++++++++++++++++++++++++ web/src/views/live/LiveCameraView.tsx | 5 ++-- 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 web/src/hooks/use-session-state.ts diff --git a/web/src/hooks/use-session-state.ts b/web/src/hooks/use-session-state.ts new file mode 100644 index 000000000..7729ead20 --- /dev/null +++ b/web/src/hooks/use-session-state.ts @@ -0,0 +1,39 @@ +import { useCallback, useState } from "react"; + +type useSessionStorageReturn = [ + value: S | undefined, + setValue: (value: S | undefined) => void, +]; + +export function useSessionStorage( + key: string, + defaultValue: S | undefined = undefined, +): useSessionStorageReturn { + const [storedValue, setStoredValue] = useState(() => { + try { + const value = window.sessionStorage.getItem(key); + + if (value) { + return JSON.parse(value); + } else { + window.sessionStorage.setItem(key, JSON.stringify(defaultValue)); + return defaultValue; + } + } catch (err) { + return defaultValue; + } + }); + + const setValue = useCallback( + (newValue: S | undefined) => { + try { + window.sessionStorage.setItem(key, JSON.stringify(newValue)); + // eslint-disable-next-line no-empty + } catch (err) {} + setStoredValue(newValue); + }, + [key], + ); + + return [storedValue, setValue]; +} diff --git a/web/src/views/live/LiveCameraView.tsx b/web/src/views/live/LiveCameraView.tsx index 033b0d71c..18228b85d 100644 --- a/web/src/views/live/LiveCameraView.tsx +++ b/web/src/views/live/LiveCameraView.tsx @@ -78,6 +78,7 @@ import { useNavigate } from "react-router-dom"; import { TransformWrapper, TransformComponent } from "react-zoom-pan-pinch"; import useSWR from "swr"; import { cn } from "@/lib/utils"; +import { useSessionStorage } from "@/hooks/use-session-state"; type LiveCameraViewProps = { config?: FrigateConfig; @@ -194,7 +195,7 @@ export default function LiveCameraView({ // playback state - const [audio, setAudio] = useState(false); + const [audio, setAudio] = useSessionStorage("liveAudio", false); const [mic, setMic] = useState(false); const [webRTC, setWebRTC] = useState(false); const [pip, setPip] = useState(false); @@ -404,7 +405,7 @@ export default function LiveCameraView({ className="p-2 md:p-0" variant={fullscreen ? "overlay" : "primary"} Icon={audio ? GiSpeaker : GiSpeakerOff} - isActive={audio} + isActive={audio ?? false} title={`${audio ? "Disable" : "Enable"} Camera Audio`} onClick={() => setAudio(!audio)} />