/* * Vencord, a Discord client mod * Copyright (c) 2024 Vendicated and contributors * SPDX-License-Identifier: GPL-3.0-or-later */ import { useSettings } from "@api/Settings"; import { classNameFactory } from "@api/Styles"; import { PluginCard } from "@components/PluginSettings"; import { ChangeList } from "@utils/ChangeList"; import { ModalContent, ModalFooter, ModalHeader, ModalProps, ModalRoot, ModalSize, openModal } from "@utils/modal"; import { Alerts, Button, Flex, Forms, Parser, React, Text, Tooltip, useMemo } from "@webpack/common"; import Plugins from "~plugins"; import { getNewPlugins, writeKnownPlugins } from "./knownPlugins"; const cl = classNameFactory("vc-plugins-"); let hasSeen = false; // Most of this was stolen from PluginSettings directly. export function NewPluginsModal({ modalProps, newPlugins }: { modalProps: ModalProps; newPlugins: Set; }) { const settings = useSettings(); const changes = React.useMemo(() => new ChangeList(), []); React.useEffect(() => { return () => void (changes.hasChanges && Alerts.show({ title: "Restart required", body: ( <>

The following plugins require a restart:

{changes.map((s, i) => ( <> {i > 0 && ", "} {Parser.parse("`" + s + "`")} ))}
), confirmText: "Restart now", cancelText: "Later!", onConfirm: () => location.reload() })); }, []); const depMap = React.useMemo(() => { const o = {} as Record; 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; }, []); const sortedPlugins = useMemo(() => [...newPlugins].map(pn => Plugins[pn]) .sort((a, b) => a.name.localeCompare(b.name)), []); const plugins = [] as JSX.Element[]; const requiredPlugins = [] as JSX.Element[]; for (const p of sortedPlugins) { if (p.hidden) continue; const isRequired = p.required || depMap[p.name]?.some(d => settings.plugins[d].enabled); if (isRequired) { const tooltipText = p.required ? "This plugin is required for Vencord to function." : makeDependencyList(depMap[p.name]?.filter(d => settings.plugins[d].enabled)); requiredPlugins.push( {({ onMouseLeave, onMouseEnter }) => ( changes.handleChange(name)} disabled={true} plugin={p} key={p.name} /> )} ); } else { plugins.push( changes.handleChange(name)} disabled={false} plugin={p} key={p.name} /> ); } } return New Plugins ({[...plugins, ...requiredPlugins].length})
{[...plugins, ...requiredPlugins]}
; } function makeDependencyList(deps: string[]) { return ( This plugin is required by: {deps.map((dep: string) => {dep})} ); } export async function openNewPluginsModal() { const newPlugins = await getNewPlugins(); if (newPlugins.size && !hasSeen) { hasSeen = true; openModal(modalProps => ( )); } }