diff options
-rw-r--r-- | src/api/settings.ts | 18 | ||||
-rw-r--r-- | src/components/PluginSettings/index.tsx | 2 |
2 files changed, 16 insertions, 4 deletions
diff --git a/src/api/settings.ts b/src/api/settings.ts index c551df0..1ca2611 100644 --- a/src/api/settings.ts +++ b/src/api/settings.ts @@ -167,11 +167,11 @@ export const Settings = makeProxy(settings); * @returns Settings */ // TODO: Representing paths as essentially "string[].join('.')" wont allow dots in paths, change to "paths?: string[][]" later -export function useSettings(paths?: string[]) { +export function useSettings(paths?: UseSettings<Settings>[]) { const [, forceUpdate] = React.useReducer(() => ({}), {}); const onUpdate: SubscriptionCallback = paths - ? (value, path) => paths.includes(path) && forceUpdate() + ? (value, path) => paths.includes(path as UseSettings<Settings>) && forceUpdate() : forceUpdate; React.useEffect(() => { @@ -229,7 +229,7 @@ export function definePluginSettings<D extends SettingsDefinition, C extends Set return Settings.plugins[definedSettings.pluginName] as any; }, use: settings => useSettings( - settings?.map(name => `plugins.${definedSettings.pluginName}.${name}`) + settings?.map(name => `plugins.${definedSettings.pluginName}.${name}`) as UseSettings<Settings>[] ).plugins[definedSettings.pluginName] as any, def, checks: checks ?? {}, @@ -237,3 +237,15 @@ export function definePluginSettings<D extends SettingsDefinition, C extends Set }; return definedSettings; } + +type UseSettings<T extends object> = ResolveUseSettings<T>[keyof T]; + +type ResolveUseSettings<T extends object> = { + [Key in keyof T]: + Key extends string + ? T[Key] extends Record<string, unknown> + // @ts-ignore "Type instantiation is excessively deep and possibly infinite" + ? UseSettings<T[Key]> extends string ? `${Key}.${UseSettings<T[Key]>}` : never + : Key + : never; +}; diff --git a/src/components/PluginSettings/index.tsx b/src/components/PluginSettings/index.tsx index 3d69a60..02d89f8 100644 --- a/src/components/PluginSettings/index.tsx +++ b/src/components/PluginSettings/index.tsx @@ -93,7 +93,7 @@ interface PluginCardProps extends React.HTMLProps<HTMLDivElement> { } function PluginCard({ plugin, disabled, onRestartNeeded, onMouseEnter, onMouseLeave, isNew }: PluginCardProps) { - const settings = useSettings([`plugins.${plugin.name}`]).plugins[plugin.name]; + const settings = useSettings([`plugins.${plugin.name}.enabled`]).plugins[plugin.name]; const isEnabled = () => settings.enabled ?? false; |