import {Dispatch, SetStateAction, useEffect, useMemo, useState} from "react"; import {RegistryKey, RegistryValueType, settings, ValuedRegistryKey} from "tc-shared/settings"; import {IpcRegistryDescription, Registry} from "tc-events"; export function useDependentState( factory: (prevState?: S) => S, inputs: ReadonlyArray, ): [S, Dispatch>] { let skipCalculation = false; let [state, setState] = useState(() => { skipCalculation = true; return factory(undefined); }); useMemo(() => { if(skipCalculation) { return; } const newState = factory(state); if (newState !== state) { setState(state = newState); } }, inputs); return [state, setState]; } export function useTr(message: string) : string { return /* @tr-ignore */ tr(message); } export function joinClassList(...classes: any[]) : string { return classes.filter(value => typeof value === "string" && value.length > 0).join(" "); } export function useGlobalSetting(key: ValuedRegistryKey, defaultValue?: V) : V; export function useGlobalSetting(key: RegistryKey, defaultValue: DV) : V | DV; export function useGlobalSetting(key, defaultValue) { const [ value, setValue ] = useState(arguments.length > 1 ? settings.getValue(key, defaultValue) : settings.getValue(key)); useEffect(() => settings.globalChangeListener(key, value => setValue(value)), []); return value; } export function useRegistry(description: IpcRegistryDescription | undefined) : Registry | undefined; export function useRegistry(description: IpcRegistryDescription) : Registry export function useRegistry(description) { const events = useMemo(() => description ? Registry.fromIpcDescription(description) : undefined, [ description ]); useEffect(() => () => events?.destroy(), [ description ]); return events; }