aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVendicated <vendicated@riseup.net>2023-03-04 18:40:37 +0100
committerVendicated <vendicated@riseup.net>2023-03-04 18:41:32 +0100
commitcab72e1be627fb7cb06725d0a3e262e214de170f (patch)
treedcd1daddf420be1bad26955d15ec4ea9ec65abfb /src
parent92372bde1d422e2daf2e24dd05ae5f4d73f5ebcb (diff)
downloadVencord-cab72e1be627fb7cb06725d0a3e262e214de170f.tar.gz
Vencord-cab72e1be627fb7cb06725d0a3e262e214de170f.tar.bz2
Vencord-cab72e1be627fb7cb06725d0a3e262e214de170f.zip
Strongly type useSettings (supersedes #559)
Diffstat (limited to 'src')
-rw-r--r--src/api/settings.ts18
-rw-r--r--src/components/PluginSettings/index.tsx2
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;