diff options
Diffstat (limited to 'src/components/Settings.tsx')
-rw-r--r-- | src/components/Settings.tsx | 85 |
1 files changed, 56 insertions, 29 deletions
diff --git a/src/components/Settings.tsx b/src/components/Settings.tsx index c274366..dfea116 100644 --- a/src/components/Settings.tsx +++ b/src/components/Settings.tsx @@ -1,9 +1,9 @@ -import { useAwaiter } from "../utils/misc"; +import { humanFriendlyJoin, useAwaiter } from "../utils/misc"; import Plugins from 'plugins'; import { useSettings } from "../api/settings"; import IpcEvents from "../utils/IpcEvents"; -import { Button, ButtonProps, Flex, Switch, Forms } from "../webpack/common"; +import { Button, ButtonProps, Flex, Switch, Forms, React } from "../webpack/common"; import ErrorBoundary from "./ErrorBoundary"; import { startPlugin } from "../plugins"; import { stopPlugin } from '../plugins/index'; @@ -12,6 +12,22 @@ export default ErrorBoundary.wrap(function Settings(props) { const [settingsDir, , settingsDirPending] = useAwaiter(() => VencordNative.ipc.invoke<string>(IpcEvents.GET_SETTINGS_DIR), "Loading..."); const settings = useSettings(); + const depMap = React.useMemo(() => { + const o = {} as Record<string, string[]>; + for (const plugin in Plugins) { + const deps = Plugins[plugin].dependencies; + if (deps) { + for (const dep of deps) { + o[dep] ??= []; + o[dep].push(plugin); + } + } + } + return o; + }, []); + + console.log(depMap); + return ( <Forms.FormSection tag="h1" title="Vencord"> <Forms.FormText>SettingsDir: {settingsDir}</Forms.FormText> @@ -45,39 +61,50 @@ export default ErrorBoundary.wrap(function Settings(props) { </Switch> <Forms.FormDivider /> <Forms.FormTitle tag="h5">Plugins</Forms.FormTitle> - {Object.values(Plugins).map(p => ( - <Switch - disabled={p.required === true} - key={p.name} - value={settings.plugins[p.name].enabled} - onChange={v => { - settings.plugins[p.name].enabled = v; - if (v) { - p.dependencies?.forEach(d => { - settings.plugins[d].enabled = true; - if (!Plugins[d].started && !stopPlugin) { + {Object.values(Plugins).map(p => { + const enabledDependants = depMap[p.name]?.filter(d => settings.plugins[d].enabled); + const dependency = enabledDependants?.length; + + return ( + <Switch + disabled={p.required || dependency} + key={p.name} + value={settings.plugins[p.name].enabled || p.required || dependency} + onChange={v => { + settings.plugins[p.name].enabled = v; + if (v) { + p.dependencies?.forEach(d => { + settings.plugins[d].enabled = true; + if (!Plugins[d].started && !stopPlugin) { + // TODO show notification + settings.plugins[p.name].enabled = false; + } + }); + if (!p.started && !startPlugin(p)) { + // TODO show notification + } + } else { + if (p.started && !stopPlugin(p)) { // TODO show notification - settings.plugins[p.name].enabled = false; } - }); - if (!p.started && !startPlugin(p)) { - // TODO show notification } - } else { - if (p.started && !stopPlugin(p)) { + if (p.patches) { // TODO show notification } + }} + note={p.description} + tooltipNote={ + p.required ? + "This plugin is required. Thus you cannot disable it." + : dependency ? + `${humanFriendlyJoin(enabledDependants)} ${enabledDependants.length === 1 ? "depends" : "depend"} on this plugin. Thus you cannot disable it.` + : "" } - if (p.patches) { - // TODO show notification - } - }} - note={p.description} - tooltipNote={p.required ? "This plugin is required. Thus you cannot disable it." : undefined} - > - {p.name} - </Switch> - )) + > + {p.name} + </Switch> + ); + }) } </Forms.FormSection > ); |