mirror of
https://github.com/Vendicated/Vencord.git
synced 2024-09-20 06:30:35 +00:00
Compare commits
6 commits
bdfe5c384d
...
b47cbaa485
Author | SHA1 | Date | |
---|---|---|---|
|
b47cbaa485 | ||
|
8afd79dd50 | ||
|
65c5897dc3 | ||
|
01d3660e92 | ||
|
db670d844c | ||
|
d20c1dbc70 |
15 changed files with 180 additions and 89 deletions
|
@ -19,7 +19,6 @@
|
||||||
import "./styles.css";
|
import "./styles.css";
|
||||||
|
|
||||||
import * as DataStore from "@api/DataStore";
|
import * as DataStore from "@api/DataStore";
|
||||||
import { showNotice } from "@api/Notices";
|
|
||||||
import { Settings, useSettings } from "@api/Settings";
|
import { Settings, useSettings } from "@api/Settings";
|
||||||
import { classNameFactory } from "@api/Styles";
|
import { classNameFactory } from "@api/Styles";
|
||||||
import { CogWheel, InfoIcon } from "@components/Icons";
|
import { CogWheel, InfoIcon } from "@components/Icons";
|
||||||
|
@ -27,38 +26,24 @@ import { openPluginModal } from "@components/PluginSettings/PluginModal";
|
||||||
import { AddonCard } from "@components/VencordSettings/AddonCard";
|
import { AddonCard } from "@components/VencordSettings/AddonCard";
|
||||||
import { SettingsTab } from "@components/VencordSettings/shared";
|
import { SettingsTab } from "@components/VencordSettings/shared";
|
||||||
import { ChangeList } from "@utils/ChangeList";
|
import { ChangeList } from "@utils/ChangeList";
|
||||||
import { proxyLazy } from "@utils/lazy";
|
|
||||||
import { Logger } from "@utils/Logger";
|
|
||||||
import { Margins } from "@utils/margins";
|
import { Margins } from "@utils/margins";
|
||||||
import { classes, isObjectEmpty } from "@utils/misc";
|
import { classes, isObjectEmpty } from "@utils/misc";
|
||||||
import { useAwaiter } from "@utils/react";
|
import { useAwaiter } from "@utils/react";
|
||||||
import { Plugin } from "@utils/types";
|
import { Plugin } from "@utils/types";
|
||||||
import { findByPropsLazy } from "@webpack";
|
import { findByPropsLazy } from "@webpack";
|
||||||
import { Alerts, Button, Card, Forms, lodash, Parser, React, Select, Text, TextInput, Toasts, Tooltip, useMemo } from "@webpack/common";
|
import { Alerts, Button, Card, Forms, lodash, Parser, React, Select, Text, TextInput, Tooltip, useMemo } from "@webpack/common";
|
||||||
|
|
||||||
import Plugins, { ExcludedPlugins } from "~plugins";
|
import Plugins, { ExcludedPlugins } from "~plugins";
|
||||||
|
|
||||||
// Avoid circular dependency
|
import { ExcludedReasons, togglePluginEnabled } from "./utils";
|
||||||
const { startDependenciesRecursive, startPlugin, stopPlugin } = proxyLazy(() => require("../../plugins"));
|
|
||||||
|
|
||||||
const cl = classNameFactory("vc-plugins-");
|
const cl = classNameFactory("vc-plugins-");
|
||||||
const logger = new Logger("PluginSettings", "#a6d189");
|
|
||||||
|
|
||||||
const InputStyles = findByPropsLazy("inputWrapper", "inputDefault", "error");
|
const InputStyles = findByPropsLazy("inputWrapper", "inputDefault", "error");
|
||||||
const ButtonClasses = findByPropsLazy("button", "disabled", "enabled");
|
const ButtonClasses = findByPropsLazy("button", "disabled", "enabled");
|
||||||
|
|
||||||
|
|
||||||
function showErrorToast(message: string) {
|
|
||||||
Toasts.show({
|
|
||||||
message,
|
|
||||||
type: Toasts.Type.FAILURE,
|
|
||||||
id: Toasts.genId(),
|
|
||||||
options: {
|
|
||||||
position: Toasts.Position.BOTTOM
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function ReloadRequiredCard({ required }: { required: boolean; }) {
|
function ReloadRequiredCard({ required }: { required: boolean; }) {
|
||||||
return (
|
return (
|
||||||
<Card className={cl("info-card", { "restart-card": required })}>
|
<Card className={cl("info-card", { "restart-card": required })}>
|
||||||
|
@ -91,54 +76,9 @@ interface PluginCardProps extends React.HTMLProps<HTMLDivElement> {
|
||||||
}
|
}
|
||||||
|
|
||||||
export function PluginCard({ plugin, disabled, onRestartNeeded, onMouseEnter, onMouseLeave, isNew }: PluginCardProps) {
|
export function PluginCard({ plugin, disabled, onRestartNeeded, onMouseEnter, onMouseLeave, isNew }: PluginCardProps) {
|
||||||
const settings = Settings.plugins[plugin.name];
|
const isEnabled = () => Settings.plugins[plugin.name].enabled ?? false;
|
||||||
|
|
||||||
const isEnabled = () => settings.enabled ?? false;
|
const togglePlugin = () => togglePluginEnabled(isEnabled(), plugin, onRestartNeeded);
|
||||||
|
|
||||||
function toggleEnabled() {
|
|
||||||
const wasEnabled = isEnabled();
|
|
||||||
|
|
||||||
// If we're enabling a plugin, make sure all deps are enabled recursively.
|
|
||||||
if (!wasEnabled) {
|
|
||||||
const { restartNeeded, failures } = startDependenciesRecursive(plugin);
|
|
||||||
if (failures.length) {
|
|
||||||
logger.error(`Failed to start dependencies for ${plugin.name}: ${failures.join(", ")}`);
|
|
||||||
showNotice("Failed to start dependencies: " + failures.join(", "), "Close", () => null);
|
|
||||||
return;
|
|
||||||
} else if (restartNeeded) {
|
|
||||||
// If any dependencies have patches, don't start the plugin yet.
|
|
||||||
settings.enabled = true;
|
|
||||||
onRestartNeeded(plugin.name);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// if the plugin has patches, dont use stopPlugin/startPlugin. Wait for restart to apply changes.
|
|
||||||
if (plugin.patches?.length) {
|
|
||||||
settings.enabled = !wasEnabled;
|
|
||||||
onRestartNeeded(plugin.name);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the plugin is enabled, but hasn't been started, then we can just toggle it off.
|
|
||||||
if (wasEnabled && !plugin.started) {
|
|
||||||
settings.enabled = !wasEnabled;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const result = wasEnabled ? stopPlugin(plugin) : startPlugin(plugin);
|
|
||||||
|
|
||||||
if (!result) {
|
|
||||||
settings.enabled = false;
|
|
||||||
|
|
||||||
const msg = `Error while ${wasEnabled ? "stopping" : "starting"} plugin ${plugin.name}`;
|
|
||||||
logger.error(msg);
|
|
||||||
showErrorToast(msg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
settings.enabled = !wasEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<AddonCard
|
<AddonCard
|
||||||
|
@ -146,7 +86,7 @@ export function PluginCard({ plugin, disabled, onRestartNeeded, onMouseEnter, on
|
||||||
description={plugin.description}
|
description={plugin.description}
|
||||||
isNew={isNew}
|
isNew={isNew}
|
||||||
enabled={isEnabled()}
|
enabled={isEnabled()}
|
||||||
setEnabled={toggleEnabled}
|
setEnabled={togglePlugin}
|
||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
onMouseEnter={onMouseEnter}
|
onMouseEnter={onMouseEnter}
|
||||||
onMouseLeave={onMouseLeave}
|
onMouseLeave={onMouseLeave}
|
||||||
|
@ -176,14 +116,6 @@ function ExcludedPluginsList({ search }: { search: string; }) {
|
||||||
const matchingExcludedPlugins = Object.entries(ExcludedPlugins)
|
const matchingExcludedPlugins = Object.entries(ExcludedPlugins)
|
||||||
.filter(([name]) => name.toLowerCase().includes(search));
|
.filter(([name]) => name.toLowerCase().includes(search));
|
||||||
|
|
||||||
const ExcludedReasons: Record<"web" | "discordDesktop" | "vencordDesktop" | "desktop" | "dev", string> = {
|
|
||||||
desktop: "Discord Desktop app or Vesktop",
|
|
||||||
discordDesktop: "Discord Desktop app",
|
|
||||||
vencordDesktop: "Vesktop app",
|
|
||||||
web: "Vesktop app and the Web version of Discord",
|
|
||||||
dev: "Developer version of Vencord"
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Text variant="text-md/normal" className={Margins.top16}>
|
<Text variant="text-md/normal" className={Margins.top16}>
|
||||||
{matchingExcludedPlugins.length
|
{matchingExcludedPlugins.length
|
||||||
|
@ -292,10 +224,10 @@ export default function PluginSettings() {
|
||||||
|
|
||||||
if (!pluginFilter(p)) continue;
|
if (!pluginFilter(p)) continue;
|
||||||
|
|
||||||
const isRequired = p.required || depMap[p.name]?.some(d => settings.plugins[d].enabled);
|
const isRequired = p.required || p.isDependency || depMap[p.name]?.some(d => settings.plugins[d].enabled);
|
||||||
|
|
||||||
if (isRequired) {
|
if (isRequired) {
|
||||||
const tooltipText = p.required
|
const tooltipText = p.required || !depMap[p.name]
|
||||||
? "This plugin is required for Vencord to function."
|
? "This plugin is required for Vencord to function."
|
||||||
: makeDependencyList(depMap[p.name]?.filter(d => settings.plugins[d].enabled));
|
: makeDependencyList(depMap[p.name]?.filter(d => settings.plugins[d].enabled));
|
||||||
|
|
||||||
|
|
83
src/components/PluginSettings/utils.ts
Normal file
83
src/components/PluginSettings/utils.ts
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
/*
|
||||||
|
* Vencord, a Discord client mod
|
||||||
|
* Copyright (c) 2024 Vendicated and contributors
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { showNotice } from "@api/Notices";
|
||||||
|
import { Settings } from "@api/Settings";
|
||||||
|
import { proxyLazy } from "@utils/lazy";
|
||||||
|
import { Logger } from "@utils/Logger";
|
||||||
|
import { Plugin } from "@utils/types";
|
||||||
|
import { Toasts } from "@webpack/common";
|
||||||
|
|
||||||
|
// Avoid circular dependency
|
||||||
|
const { startDependenciesRecursive, startPlugin, stopPlugin } = proxyLazy(() => require("../../plugins"));
|
||||||
|
|
||||||
|
|
||||||
|
const logger = new Logger("PluginSettings", "#a6d189");
|
||||||
|
|
||||||
|
function showErrorToast(message: string) {
|
||||||
|
Toasts.show({
|
||||||
|
message,
|
||||||
|
type: Toasts.Type.FAILURE,
|
||||||
|
id: Toasts.genId(),
|
||||||
|
options: {
|
||||||
|
position: Toasts.Position.BOTTOM
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function togglePluginEnabled(isEnabled: boolean, plugin: Plugin,onRestartNeeded: (pluginName: string) => void) {
|
||||||
|
const settings = Settings.plugins[plugin.name];
|
||||||
|
const wasEnabled = isEnabled;
|
||||||
|
|
||||||
|
// If we're enabling a plugin, make sure all deps are enabled recursively.
|
||||||
|
if (!wasEnabled) {
|
||||||
|
const { restartNeeded, failures } = startDependenciesRecursive(plugin);
|
||||||
|
if (failures.length) {
|
||||||
|
logger.error(`Failed to start dependencies for ${plugin.name}: ${failures.join(", ")}`);
|
||||||
|
showNotice("Failed to start dependencies: " + failures.join(", "), "Close", () => null);
|
||||||
|
return;
|
||||||
|
} else if (restartNeeded) {
|
||||||
|
// If any dependencies have patches, don't start the plugin yet.
|
||||||
|
settings.enabled = true;
|
||||||
|
onRestartNeeded(plugin.name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the plugin has patches, dont use stopPlugin/startPlugin. Wait for restart to apply changes.
|
||||||
|
if (plugin.patches?.length) {
|
||||||
|
settings.enabled = !wasEnabled;
|
||||||
|
onRestartNeeded(plugin.name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the plugin is enabled, but hasn't been started, then we can just toggle it off.
|
||||||
|
if (wasEnabled && !plugin.started) {
|
||||||
|
settings.enabled = !wasEnabled;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = wasEnabled ? stopPlugin(plugin) : startPlugin(plugin);
|
||||||
|
|
||||||
|
if (!result) {
|
||||||
|
settings.enabled = false;
|
||||||
|
|
||||||
|
const msg = `Error while ${wasEnabled ? "stopping" : "starting"} plugin ${plugin.name}`;
|
||||||
|
logger.error(msg);
|
||||||
|
showErrorToast(msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
settings.enabled = !wasEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ExcludedReasons: Record<"web" | "discordDesktop" | "vencordDesktop" | "desktop" | "dev", string> = {
|
||||||
|
desktop: "Discord Desktop app or Vesktop",
|
||||||
|
discordDesktop: "Discord Desktop app",
|
||||||
|
vencordDesktop: "Vesktop app",
|
||||||
|
web: "Vesktop app and the Web version of Discord",
|
||||||
|
dev: "Developer version of Vencord"
|
||||||
|
};
|
|
@ -22,12 +22,14 @@ import { getUserSettingLazy } from "@api/UserSettings";
|
||||||
import ErrorBoundary from "@components/ErrorBoundary";
|
import ErrorBoundary from "@components/ErrorBoundary";
|
||||||
import { Flex } from "@components/Flex";
|
import { Flex } from "@components/Flex";
|
||||||
import { Link } from "@components/Link";
|
import { Link } from "@components/Link";
|
||||||
|
import { openPluginModal } from "@components/PluginSettings/PluginModal";
|
||||||
|
import { ExcludedReasons, togglePluginEnabled } from "@components/PluginSettings/utils";
|
||||||
import { openUpdaterModal } from "@components/VencordSettings/UpdaterTab";
|
import { openUpdaterModal } from "@components/VencordSettings/UpdaterTab";
|
||||||
import { Devs, SUPPORT_CHANNEL_ID } from "@utils/constants";
|
import { Devs, SUPPORT_CHANNEL_ID } from "@utils/constants";
|
||||||
import { sendMessage } from "@utils/discord";
|
import { sendMessage } from "@utils/discord";
|
||||||
import { Logger } from "@utils/Logger";
|
import { Logger } from "@utils/Logger";
|
||||||
import { Margins } from "@utils/margins";
|
import { Margins } from "@utils/margins";
|
||||||
import { isPluginDev, tryOrElse } from "@utils/misc";
|
import { isObjectEmpty, isPluginDev, tryOrElse } from "@utils/misc";
|
||||||
import { relaunch } from "@utils/native";
|
import { relaunch } from "@utils/native";
|
||||||
import { onlyOnce } from "@utils/onlyOnce";
|
import { onlyOnce } from "@utils/onlyOnce";
|
||||||
import { makeCodeblock } from "@utils/text";
|
import { makeCodeblock } from "@utils/text";
|
||||||
|
@ -36,7 +38,7 @@ import { checkForUpdates, isOutdated, update } from "@utils/updater";
|
||||||
import { Alerts, Button, Card, ChannelStore, Forms, GuildMemberStore, Parser, RelationshipStore, showToast, Text, Toasts, UserStore } from "@webpack/common";
|
import { Alerts, Button, Card, ChannelStore, Forms, GuildMemberStore, Parser, RelationshipStore, showToast, Text, Toasts, UserStore } from "@webpack/common";
|
||||||
|
|
||||||
import gitHash from "~git-hash";
|
import gitHash from "~git-hash";
|
||||||
import plugins, { PluginMeta } from "~plugins";
|
import plugins, { ExcludedPlugins, PluginMeta } from "~plugins";
|
||||||
|
|
||||||
import SettingsPlugin from "./settings";
|
import SettingsPlugin from "./settings";
|
||||||
|
|
||||||
|
@ -142,7 +144,7 @@ export default definePlugin({
|
||||||
required: true,
|
required: true,
|
||||||
description: "Helps us provide support to you",
|
description: "Helps us provide support to you",
|
||||||
authors: [Devs.Ven],
|
authors: [Devs.Ven],
|
||||||
dependencies: ["CommandsAPI", "UserSettingsAPI", "MessageAccessoriesAPI"],
|
dependencies: ["UserSettingsAPI", "MessageAccessoriesAPI"],
|
||||||
|
|
||||||
settings,
|
settings,
|
||||||
|
|
||||||
|
@ -321,6 +323,55 @@ export default definePlugin({
|
||||||
</Button>
|
</Button>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
if (props.message.embeds[0]?.url?.includes("/plugins/")) {
|
||||||
|
const pluginName = props.message.embeds[0].rawTitle;
|
||||||
|
const excludedPlugin = ExcludedPlugins[pluginName];
|
||||||
|
if (excludedPlugin) {
|
||||||
|
buttons.push(
|
||||||
|
<Button
|
||||||
|
key="vc-plugin-notice"
|
||||||
|
color={Button.Colors.RED}
|
||||||
|
>
|
||||||
|
Only available on {ExcludedReasons[excludedPlugin]}
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
// button really wide, good ideas?
|
||||||
|
} else {
|
||||||
|
const isEnabled = Vencord.Plugins.isPluginEnabled(pluginName);
|
||||||
|
const toggle = isEnabled ? "Disable" : "Enable";
|
||||||
|
const plugin = plugins[pluginName];
|
||||||
|
const onRestartNeeded = () => showToast("Restart to apply changes!");
|
||||||
|
const togglePlugin = () => togglePluginEnabled(isEnabled, plugin, onRestartNeeded);
|
||||||
|
if (plugin.required) {
|
||||||
|
buttons.push(
|
||||||
|
<Button
|
||||||
|
key="vc-required-plugin"
|
||||||
|
>
|
||||||
|
{pluginName} is required
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
buttons.push(
|
||||||
|
<Button
|
||||||
|
key="vc-enable-plugin"
|
||||||
|
onClick={togglePlugin}
|
||||||
|
>
|
||||||
|
{toggle} {pluginName}
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (plugin.options && !isObjectEmpty(plugin.options)) {
|
||||||
|
buttons.push(
|
||||||
|
<Button
|
||||||
|
key="vc-plugin-settings"
|
||||||
|
onClick={() => openPluginModal(plugin, onRestartNeeded)}
|
||||||
|
>
|
||||||
|
Open plugin Settings
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,6 @@ export default definePlugin({
|
||||||
name: "FriendInvites",
|
name: "FriendInvites",
|
||||||
description: "Create and manage friend invite links via slash commands (/create friend invite, /view friend invites, /revoke friend invites).",
|
description: "Create and manage friend invite links via slash commands (/create friend invite, /view friend invites, /revoke friend invites).",
|
||||||
authors: [Devs.afn, Devs.Dziurwa],
|
authors: [Devs.afn, Devs.Dziurwa],
|
||||||
dependencies: ["CommandsAPI"],
|
|
||||||
commands: [
|
commands: [
|
||||||
{
|
{
|
||||||
name: "create friend invite",
|
name: "create friend invite",
|
||||||
|
|
|
@ -105,6 +105,11 @@ for (const p of pluginsValues) if (isPluginEnabled(p.name)) {
|
||||||
settings[d].enabled = true;
|
settings[d].enabled = true;
|
||||||
dep.isDependency = true;
|
dep.isDependency = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (p.commands?.length) {
|
||||||
|
Plugins.CommandsAPI.isDependency = true;
|
||||||
|
settings.CommandsAPI.enabled = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const p of pluginsValues) {
|
for (const p of pluginsValues) {
|
||||||
|
|
|
@ -82,7 +82,6 @@ export default definePlugin({
|
||||||
default: true
|
default: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
dependencies: ["CommandsAPI"],
|
|
||||||
|
|
||||||
async start() {
|
async start() {
|
||||||
for (const tag of await getTags()) createTagCommand(tag);
|
for (const tag of await getTags()) createTagCommand(tag);
|
||||||
|
|
|
@ -33,7 +33,6 @@ export default definePlugin({
|
||||||
name: "MoreCommands",
|
name: "MoreCommands",
|
||||||
description: "echo, lenny, mock",
|
description: "echo, lenny, mock",
|
||||||
authors: [Devs.Arjix, Devs.echo, Devs.Samu],
|
authors: [Devs.Arjix, Devs.echo, Devs.Samu],
|
||||||
dependencies: ["CommandsAPI"],
|
|
||||||
commands: [
|
commands: [
|
||||||
{
|
{
|
||||||
name: "echo",
|
name: "echo",
|
||||||
|
|
|
@ -24,7 +24,6 @@ export default definePlugin({
|
||||||
name: "MoreKaomoji",
|
name: "MoreKaomoji",
|
||||||
description: "Adds more Kaomoji to discord. ヽ(´▽`)/",
|
description: "Adds more Kaomoji to discord. ヽ(´▽`)/",
|
||||||
authors: [Devs.JacobTm],
|
authors: [Devs.JacobTm],
|
||||||
dependencies: ["CommandsAPI"],
|
|
||||||
commands: [
|
commands: [
|
||||||
{ name: "dissatisfaction", description: " >﹏<" },
|
{ name: "dissatisfaction", description: " >﹏<" },
|
||||||
{ name: "smug", description: "ಠ_ಠ" },
|
{ name: "smug", description: "ಠ_ಠ" },
|
||||||
|
|
|
@ -88,7 +88,6 @@ export default definePlugin({
|
||||||
name: "petpet",
|
name: "petpet",
|
||||||
description: "Adds a /petpet slash command to create headpet gifs from any image",
|
description: "Adds a /petpet slash command to create headpet gifs from any image",
|
||||||
authors: [Devs.Ven],
|
authors: [Devs.Ven],
|
||||||
dependencies: ["CommandsAPI"],
|
|
||||||
commands: [
|
commands: [
|
||||||
{
|
{
|
||||||
inputType: ApplicationCommandInputType.BUILT_IN,
|
inputType: ApplicationCommandInputType.BUILT_IN,
|
||||||
|
|
|
@ -88,7 +88,7 @@ export default definePlugin({
|
||||||
name: "SilentTyping",
|
name: "SilentTyping",
|
||||||
authors: [Devs.Ven, Devs.Rini, Devs.ImBanana],
|
authors: [Devs.Ven, Devs.Rini, Devs.ImBanana],
|
||||||
description: "Hide that you are typing",
|
description: "Hide that you are typing",
|
||||||
dependencies: ["CommandsAPI", "ChatInputButtonAPI"],
|
dependencies: ["ChatInputButtonAPI"],
|
||||||
settings,
|
settings,
|
||||||
contextMenus: {
|
contextMenus: {
|
||||||
"textarea-context": ChatBarContextCheckbox
|
"textarea-context": ChatBarContextCheckbox
|
||||||
|
|
|
@ -76,7 +76,6 @@ export default definePlugin({
|
||||||
name: "SpotifyShareCommands",
|
name: "SpotifyShareCommands",
|
||||||
description: "Share your current Spotify track, album or artist via slash command (/track, /album, /artist)",
|
description: "Share your current Spotify track, album or artist via slash command (/track, /album, /artist)",
|
||||||
authors: [Devs.katlyn],
|
authors: [Devs.katlyn],
|
||||||
dependencies: ["CommandsAPI"],
|
|
||||||
commands: [
|
commands: [
|
||||||
{
|
{
|
||||||
name: "track",
|
name: "track",
|
||||||
|
|
|
@ -72,13 +72,13 @@ export interface PluginDef {
|
||||||
stop?(): void;
|
stop?(): void;
|
||||||
patches?: Omit<Patch, "plugin">[];
|
patches?: Omit<Patch, "plugin">[];
|
||||||
/**
|
/**
|
||||||
* List of commands. If you specify these, you must add CommandsAPI to dependencies
|
* List of commands that your plugin wants to register
|
||||||
*/
|
*/
|
||||||
commands?: Command[];
|
commands?: Command[];
|
||||||
/**
|
/**
|
||||||
* A list of other plugins that your plugin depends on.
|
* A list of other plugins that your plugin depends on.
|
||||||
* These will automatically be enabled and loaded before your plugin
|
* These will automatically be enabled and loaded before your plugin
|
||||||
* Common examples are CommandsAPI, MessageEventsAPI...
|
* Generally these will be API plugins
|
||||||
*/
|
*/
|
||||||
dependencies?: string[],
|
dependencies?: string[],
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -28,6 +28,8 @@ export let Forms = {} as {
|
||||||
FormText: t.FormText,
|
FormText: t.FormText,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export let Icons = {} as t.Icons;
|
||||||
|
|
||||||
export let Card: t.Card;
|
export let Card: t.Card;
|
||||||
export let Button: t.Button;
|
export let Button: t.Button;
|
||||||
export let Switch: t.Switch;
|
export let Switch: t.Switch;
|
||||||
|
@ -85,4 +87,5 @@ waitFor(["FormItem", "Button"], m => {
|
||||||
Heading
|
Heading
|
||||||
} = m);
|
} = m);
|
||||||
Forms = m;
|
Forms = m;
|
||||||
|
Icons = m;
|
||||||
});
|
});
|
||||||
|
|
11
src/webpack/common/types/components.d.ts
vendored
11
src/webpack/common/types/components.d.ts
vendored
|
@ -18,6 +18,8 @@
|
||||||
|
|
||||||
import type { ComponentType, CSSProperties, FunctionComponent, HtmlHTMLAttributes, HTMLProps, KeyboardEvent, MouseEvent, PropsWithChildren, PropsWithRef, ReactNode, Ref } from "react";
|
import type { ComponentType, CSSProperties, FunctionComponent, HtmlHTMLAttributes, HTMLProps, KeyboardEvent, MouseEvent, PropsWithChildren, PropsWithRef, ReactNode, Ref } from "react";
|
||||||
|
|
||||||
|
import { IconNames } from "./iconNames";
|
||||||
|
|
||||||
export type TextVariant = "heading-sm/normal" | "heading-sm/medium" | "heading-sm/semibold" | "heading-sm/bold" | "heading-md/normal" | "heading-md/medium" | "heading-md/semibold" | "heading-md/bold" | "heading-lg/normal" | "heading-lg/medium" | "heading-lg/semibold" | "heading-lg/bold" | "heading-xl/normal" | "heading-xl/medium" | "heading-xl/bold" | "heading-xxl/normal" | "heading-xxl/medium" | "heading-xxl/bold" | "eyebrow" | "heading-deprecated-14/normal" | "heading-deprecated-14/medium" | "heading-deprecated-14/bold" | "text-xxs/normal" | "text-xxs/medium" | "text-xxs/semibold" | "text-xxs/bold" | "text-xs/normal" | "text-xs/medium" | "text-xs/semibold" | "text-xs/bold" | "text-sm/normal" | "text-sm/medium" | "text-sm/semibold" | "text-sm/bold" | "text-md/normal" | "text-md/medium" | "text-md/semibold" | "text-md/bold" | "text-lg/normal" | "text-lg/medium" | "text-lg/semibold" | "text-lg/bold" | "display-sm" | "display-md" | "display-lg" | "code";
|
export type TextVariant = "heading-sm/normal" | "heading-sm/medium" | "heading-sm/semibold" | "heading-sm/bold" | "heading-md/normal" | "heading-md/medium" | "heading-md/semibold" | "heading-md/bold" | "heading-lg/normal" | "heading-lg/medium" | "heading-lg/semibold" | "heading-lg/bold" | "heading-xl/normal" | "heading-xl/medium" | "heading-xl/bold" | "heading-xxl/normal" | "heading-xxl/medium" | "heading-xxl/bold" | "eyebrow" | "heading-deprecated-14/normal" | "heading-deprecated-14/medium" | "heading-deprecated-14/bold" | "text-xxs/normal" | "text-xxs/medium" | "text-xxs/semibold" | "text-xxs/bold" | "text-xs/normal" | "text-xs/medium" | "text-xs/semibold" | "text-xs/bold" | "text-sm/normal" | "text-sm/medium" | "text-sm/semibold" | "text-sm/bold" | "text-md/normal" | "text-md/medium" | "text-md/semibold" | "text-md/bold" | "text-lg/normal" | "text-lg/medium" | "text-lg/semibold" | "text-lg/bold" | "display-sm" | "display-md" | "display-lg" | "code";
|
||||||
export type FormTextTypes = Record<"DEFAULT" | "INPUT_PLACEHOLDER" | "DESCRIPTION" | "LABEL_BOLD" | "LABEL_SELECTED" | "LABEL_DESCRIPTOR" | "ERROR" | "SUCCESS", string>;
|
export type FormTextTypes = Record<"DEFAULT" | "INPUT_PLACEHOLDER" | "DESCRIPTION" | "LABEL_BOLD" | "LABEL_SELECTED" | "LABEL_DESCRIPTOR" | "ERROR" | "SUCCESS", string>;
|
||||||
export type HeadingTag = `h${1 | 2 | 3 | 4 | 5 | 6}`;
|
export type HeadingTag = `h${1 | 2 | 3 | 4 | 5 | 6}`;
|
||||||
|
@ -69,7 +71,7 @@ export type FormText = ComponentType<PropsWithChildren<{
|
||||||
}> & TextProps> & { Types: FormTextTypes; };
|
}> & TextProps> & { Types: FormTextTypes; };
|
||||||
|
|
||||||
export type Tooltip = ComponentType<{
|
export type Tooltip = ComponentType<{
|
||||||
text: ReactNode;
|
text: ReactNode | ComponentType;
|
||||||
children: FunctionComponent<{
|
children: FunctionComponent<{
|
||||||
onClick(): void;
|
onClick(): void;
|
||||||
onMouseEnter(): void;
|
onMouseEnter(): void;
|
||||||
|
@ -502,3 +504,10 @@ export type Avatar = ComponentType<PropsWithChildren<{
|
||||||
type FocusLock = ComponentType<PropsWithChildren<{
|
type FocusLock = ComponentType<PropsWithChildren<{
|
||||||
containerRef: RefObject<HTMLElement>;
|
containerRef: RefObject<HTMLElement>;
|
||||||
}>>;
|
}>>;
|
||||||
|
|
||||||
|
export type Icon = ComponentType<JSX.IntrinsicElements["svg"] & {
|
||||||
|
size?: string;
|
||||||
|
colorClass?: string;
|
||||||
|
} & Record<string, any>>;
|
||||||
|
|
||||||
|
export type Icons = Record<IconNames, Icon>;
|
||||||
|
|
14
src/webpack/common/types/iconNames.d.ts
vendored
Normal file
14
src/webpack/common/types/iconNames.d.ts
vendored
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue