Files
frigate/web/src/context/streaming-settings-provider.tsx
T

69 lines
1.9 KiB
TypeScript
Raw Normal View History

2025-02-10 10:42:35 -06:00
import {
createContext,
useState,
useEffect,
ReactNode,
useContext,
} from "react";
import { AllGroupsStreamingSettings } from "@/types/frigateConfig";
import { useUserPersistence } from "@/hooks/use-user-persistence";
2025-02-10 10:42:35 -06:00
type StreamingSettingsContextType = {
allGroupsStreamingSettings: AllGroupsStreamingSettings;
setAllGroupsStreamingSettings: (settings: AllGroupsStreamingSettings) => void;
isPersistedStreamingSettingsLoaded: boolean;
};
const StreamingSettingsContext =
createContext<StreamingSettingsContextType | null>(null);
export function StreamingSettingsProvider({
children,
}: {
children: ReactNode;
}) {
const [allGroupsStreamingSettings, setAllGroupsStreamingSettings] =
useState<AllGroupsStreamingSettings>({});
const [
persistedGroupStreamingSettings,
setPersistedGroupStreamingSettings,
isPersistedStreamingSettingsLoaded,
] = useUserPersistence<AllGroupsStreamingSettings>("streaming-settings");
2025-02-10 10:42:35 -06:00
useEffect(() => {
if (isPersistedStreamingSettingsLoaded) {
setAllGroupsStreamingSettings(persistedGroupStreamingSettings ?? {});
}
}, [isPersistedStreamingSettingsLoaded, persistedGroupStreamingSettings]);
useEffect(() => {
if (Object.keys(allGroupsStreamingSettings).length) {
setPersistedGroupStreamingSettings(allGroupsStreamingSettings);
}
}, [allGroupsStreamingSettings, setPersistedGroupStreamingSettings]);
return (
2026-03-05 08:42:38 -06:00
<StreamingSettingsContext
2025-02-10 10:42:35 -06:00
value={{
allGroupsStreamingSettings,
setAllGroupsStreamingSettings,
isPersistedStreamingSettingsLoaded,
}}
>
{children}
2026-03-05 08:42:38 -06:00
</StreamingSettingsContext>
2025-02-10 10:42:35 -06:00
);
}
// eslint-disable-next-line react-refresh/only-export-components
export function useStreamingSettings() {
const context = useContext(StreamingSettingsContext);
if (!context) {
throw new Error(
"useStreamingSettings must be used within a StreamingSettingsProvider",
);
}
return context;
}