chore(ui): abstract useSetting/state combo into own hook

This commit is contained in:
Simon Knott 2024-08-06 12:53:14 +02:00
parent bff97b4810
commit c0e528b4c1
No known key found for this signature in database
GPG key ID: 8CEDC00028084AEC
2 changed files with 9 additions and 7 deletions

View file

@ -14,7 +14,7 @@
limitations under the License.
*/
import { clsx, useMeasure, useSetting } from '../uiUtils';
import { clsx, useMeasure, useSettingOrState } from '../uiUtils';
import './splitView.css';
import * as React from 'react';
@ -43,12 +43,8 @@ export const SplitView: React.FC<SplitViewProps> = ({
main,
}) => {
const defaultSize = Math.max(minSidebarSize, sidebarSize) * window.devicePixelRatio;
const hSetting = useSetting<number>((settingName ?? 'unused') + '.' + orientation + ':size', defaultSize);
const vSetting = useSetting<number>((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] = useSettingOrState(settingName + '.' + orientation + ':size', defaultSize, undefined, !!settingName);
const [vSize, setVSize] = useSettingOrState(settingName + '.' + orientation + ':size', defaultSize, undefined, !!settingName);
const [resizing, setResizing] = React.useState<{ offset: number, size: number } | null>(null);
const [measure, ref] = useMeasure<HTMLDivElement>();

View file

@ -157,6 +157,12 @@ export function useSetting<S>(name: string, defaultValue: S, title?: string): [S
return [value, setValueWrapper, setting];
}
export function useSettingOrState<S>(name: string | undefined, defaultValue: S, title?: string, persist?: boolean): [S, (v: S) => void, Setting<S>] {
const setting = useSetting(name ?? 'unused', defaultValue, title);
const state = React.useState(defaultValue);
return persist ? setting : [...state, [...state, title ?? '']];
}
export class Settings {
onChangeEmitter = new EventTarget();