fix rare config load bug

- view mode will default to admin if config does fail to load for w/e reason
- rename viewMode to currentViewMode
This commit is contained in:
spacebares 2023-07-02 16:02:47 -04:00
parent 69f083dcf1
commit 6cf4b5e7e2
5 changed files with 26 additions and 16 deletions

View File

@ -17,7 +17,7 @@ export default function AppBar() {
const [showMoreMenu, setShowMoreMenu] = useState(false); const [showMoreMenu, setShowMoreMenu] = useState(false);
const [showDialog, setShowDialog] = useState(false); const [showDialog, setShowDialog] = useState(false);
const [showDialogWait, setShowDialogWait] = useState(false); const [showDialogWait, setShowDialogWait] = useState(false);
const { viewMode, setViewMode } = useViewMode(); const { currentViewMode, setViewMode } = useViewMode();
const { setDarkMode } = useDarkMode(); const { setDarkMode } = useDarkMode();
const { send: sendRestart } = useRestart(); const { send: sendRestart } = useRestart();
@ -75,7 +75,7 @@ export default function AppBar() {
<MenuItem icon={SettingsIcon} label="Viewmode:"> <MenuItem icon={SettingsIcon} label="Viewmode:">
<select <select
className="py-0.5 pr-8" className="py-0.5 pr-8"
value={viewMode} value={currentViewMode}
onChange={(e) => handleSetViewMode(e.target.value)} onChange={(e) => handleSetViewMode(e.target.value)}
> >
{ Object.keys(ViewModeTypes).filter((v) => !isNaN(Number(v))).map(key => <option key={key} value={key}>{ViewModeTypes[key]}</option>) } { Object.keys(ViewModeTypes).filter((v) => !isNaN(Number(v))).map(key => <option key={key} value={key}>{ViewModeTypes[key]}</option>) }

View File

@ -16,7 +16,7 @@ export default function App() {
return ( return (
<DarkModeProvider> <DarkModeProvider>
<DrawerProvider> <DrawerProvider>
<ViewModeProvider> <ViewModeProvider config={config}>
<div data-testid="app" className="w-full"> <div data-testid="app" className="w-full">
<AppBar /> <AppBar />
{!config ? ( {!config ? (

View File

@ -3,9 +3,9 @@ import { useViewMode } from '../context';
import { ViewModeTypes } from './ViewOptionEnum'; import { ViewModeTypes } from './ViewOptionEnum';
export default function ViewOption({children, requiredmode }) { export default function ViewOption({children, requiredmode }) {
const { viewMode } = useViewMode(); const { currentViewMode } = useViewMode();
return viewMode >= ViewModeTypes[requiredmode] ? ( return currentViewMode >= ViewModeTypes[requiredmode] ? (
<>{children}</> <>{children}</>
) : null; ) : null;

View File

@ -2,24 +2,34 @@ import { h, createContext } from 'preact';
import { get as getData, set as setData } from 'idb-keyval'; import { get as getData, set as setData } from 'idb-keyval';
import { useCallback, useContext, useEffect, useLayoutEffect, useState } from 'preact/hooks'; import { useCallback, useContext, useEffect, useLayoutEffect, useState } from 'preact/hooks';
import { ViewModeTypes } from '../components/ViewOptionEnum'; import { ViewModeTypes } from '../components/ViewOptionEnum';
import useSWR from 'swr';
const ViewMode = createContext(null); const ViewMode = createContext("");
export function ViewModeProvider({ children }) { export function ViewModeProvider({ children, config }) {
const [viewMode, setViewMode] = usePersistence('view-mode', null); const [currentViewMode, setCurrentViewMode] = useState(null);
const { data: config } = useSWR('config');
const setViewMode = useCallback(
(value) => {
setData('view-mode', value);
setCurrentViewMode(value);
},
[setCurrentViewMode]
);
useEffect(() => { useEffect(() => {
async function load() { async function load() {
const configValue = ViewModeTypes[config.ui.viewmode]; //fixes a load error const configValue = config ? ViewModeTypes[config.ui.viewmode].toString() : "2";
setViewMode(viewMode || configValue); const viewmode = await getData('view-mode');
setViewMode(viewmode || configValue);
} }
load(); load();
}, [setViewMode, config]); }, [config, setViewMode]);
return <ViewMode.Provider value={{ viewMode, setViewMode }}>{children}</ViewMode.Provider>;
return !currentViewMode ? null : (
<ViewMode.Provider value={{ currentViewMode, setViewMode }}>{children}</ViewMode.Provider>
);
} }
export function useViewMode() { export function useViewMode() {

View File

@ -88,9 +88,9 @@ function Camera({ name, config }) {
[config, detectValue, sendDetect, recordValue, sendRecordings, snapshotValue, sendSnapshots] [config, detectValue, sendDetect, recordValue, sendRecordings, snapshotValue, sendSnapshots]
); );
const { viewMode } = useViewMode(); const { currentViewMode } = useViewMode();
return ( return (
<Card buttons={buttons} href={href} header={cleanName} icons={viewMode >= ViewModeTypes["admin"] ? icons : []} media={<CameraImage camera={name} stretch />} /> <Card buttons={buttons} href={href} header={cleanName} icons={currentViewMode >= ViewModeTypes["admin"] ? icons : []} media={<CameraImage camera={name} stretch />} />
); );
} }