diff --git a/packages/web/src/components/splitView.tsx b/packages/web/src/components/splitView.tsx index 776b8d842f..d2d0fbbd0f 100644 --- a/packages/web/src/components/splitView.tsx +++ b/packages/web/src/components/splitView.tsx @@ -43,12 +43,8 @@ export const SplitView: React.FC = ({ main, }) => { const defaultSize = Math.max(minSidebarSize, sidebarSize) * window.devicePixelRatio; - const hSetting = useSetting((settingName ?? 'unused') + '.' + orientation + ':size', defaultSize); - const vSetting = useSetting((settingName ?? 'unused') + '.' + orientation + ':size', defaultSize); - const hState = React.useState(defaultSize); - const vState = React.useState(defaultSize); - const [hSize, setHSize] = settingName ? hSetting : hState; - const [vSize, setVSize] = settingName ? vSetting : vState; + const [hSize, setHSize] = useSetting(settingName ? settingName + '.' + orientation + ':size' : undefined, defaultSize); + const [vSize, setVSize] = useSetting(settingName ? settingName + '.' + orientation + ':size' : undefined, defaultSize); const [resizing, setResizing] = React.useState<{ offset: number, size: number } | null>(null); const [measure, ref] = useMeasure(); @@ -80,8 +76,8 @@ export const SplitView: React.FC = ({ return
{main}
- { !sidebarHidden &&
{sidebar}
} - { !sidebarHidden &&
{sidebar}
} + {!sidebarHidden &&
setResizing({ offset: orientation === 'vertical' ? event.clientY : event.clientX, size })} @@ -103,6 +99,6 @@ export const SplitView: React.FC = ({ setHSize(size * window.devicePixelRatio); } }} - >
} + >
} ; }; diff --git a/packages/web/src/uiUtils.ts b/packages/web/src/uiUtils.ts index b590d75b7b..54f33d229e 100644 --- a/packages/web/src/uiUtils.ts +++ b/packages/web/src/uiUtils.ts @@ -141,17 +141,25 @@ export function copy(text: string) { export type Setting = readonly [T, (value: T) => void, string]; -export function useSetting(name: string, defaultValue: S, title?: string): [S, (v: S) => void, Setting] { - const subscribe = React.useCallback((onStoreChange: () => void) => { - settings.onChangeEmitter.addEventListener(name, onStoreChange); - return () => settings.onChangeEmitter.removeEventListener(name, onStoreChange); - }, [name]); - const value = React.useSyncExternalStore(subscribe, () => settings.getObject(name, defaultValue)); +export function useSetting(name: string | undefined, defaultValue: S, title?: string): [S, React.Dispatch>, Setting] { + if (name) + defaultValue = settings.getObject(name, defaultValue); + const [value, setValue] = React.useState(defaultValue); + const setValueWrapper = React.useCallback((value: React.SetStateAction) => { + if (name) + settings.setObject(name, value); + else + setValue(value); + }, [name, setValue]); - const setValueWrapper = React.useCallback((value: S) => { - settings.setObject(name, value); - }, [name]); + React.useEffect(() => { + if (name) { + const onStoreChange = () => setValue(settings.getObject(name, defaultValue)); + settings.onChangeEmitter.addEventListener(name, onStoreChange); + return () => settings.onChangeEmitter.removeEventListener(name, onStoreChange); + } + }, [defaultValue, name]); const setting = [value, setValueWrapper, title || name || ''] as Setting; return [value, setValueWrapper, setting];