Merge remote-tracking branch 'upstream/dev' into dev
This commit is contained in:
commit
87441e9780
18 changed files with 144 additions and 64 deletions
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "equicord",
|
||||
"private": "true",
|
||||
"version": "1.13.0",
|
||||
"version": "1.13.1",
|
||||
"description": "The other cutest Discord client mod",
|
||||
"homepage": "https://github.com/Equicord/Equicord#readme",
|
||||
"bugs": {
|
||||
|
|
|
|||
13
packages/discord-types/src/components.d.ts
vendored
13
packages/discord-types/src/components.d.ts
vendored
|
|
@ -162,19 +162,6 @@ export type Button = ComponentType<ButtonProps> & {
|
|||
Link: any;
|
||||
};
|
||||
|
||||
export type Switch = ComponentType<PropsWithChildren<{
|
||||
value: boolean;
|
||||
onChange(value: boolean): void;
|
||||
|
||||
disabled?: boolean;
|
||||
hideBorder?: boolean;
|
||||
className?: string;
|
||||
style?: CSSProperties;
|
||||
|
||||
note?: ReactNode;
|
||||
tooltipNote?: ReactNode;
|
||||
}>>;
|
||||
|
||||
export type CheckboxAligns = {
|
||||
CENTER: "center";
|
||||
TOP: "top";
|
||||
|
|
|
|||
5
src/components/FormDivider.css
Normal file
5
src/components/FormDivider.css
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
.vc-form-divider {
|
||||
border-top: thin solid var(--border-subtle);
|
||||
width: 100%;
|
||||
height: 1px;
|
||||
}
|
||||
13
src/components/FormDivider.tsx
Normal file
13
src/components/FormDivider.tsx
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
/*
|
||||
* Vencord, a Discord client mod
|
||||
* Copyright (c) 2025 Vendicated and contributors
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
import "./FormDivider.css";
|
||||
|
||||
import { classes } from "@utils/misc";
|
||||
|
||||
export function FormDivider({ className }: { className?: string; }) {
|
||||
return <div className={classes("vc-form-divider", className)} />;
|
||||
}
|
||||
29
src/components/FormSwitch.css
Normal file
29
src/components/FormSwitch.css
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
.vc-form-switch-wrapper {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.vc-form-switch {
|
||||
display: flex;
|
||||
width: 100%;
|
||||
|
||||
> :last-child {
|
||||
margin-left: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.vc-form-switch-disabled {
|
||||
opacity: 0.5;
|
||||
pointer-events: none;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.vc-form-switch-text {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.vc-form-switch-border {
|
||||
margin-top: 20px;
|
||||
}
|
||||
46
src/components/FormSwitch.tsx
Normal file
46
src/components/FormSwitch.tsx
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* Vencord, a Discord client mod
|
||||
* Copyright (c) 2025 Vendicated and contributors
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
import "./FormSwitch.css";
|
||||
|
||||
import { classes } from "@utils/misc";
|
||||
import { Text } from "@webpack/common";
|
||||
import type { PropsWithChildren, ReactNode } from "react";
|
||||
|
||||
import { FormDivider } from "./FormDivider";
|
||||
import { Switch } from "./Switch";
|
||||
|
||||
export interface FormSwitchProps {
|
||||
title: ReactNode;
|
||||
description?: ReactNode;
|
||||
value: boolean;
|
||||
onChange(value: boolean): void;
|
||||
|
||||
className?: string;
|
||||
disabled?: boolean;
|
||||
hideBorder?: boolean;
|
||||
}
|
||||
|
||||
export function FormSwitch({ onChange, title, value, description, disabled, className, hideBorder }: FormSwitchProps) {
|
||||
return (
|
||||
<div className="vc-form-switch-wrapper">
|
||||
<div className={classes("vc-form-switch", className, disabled && "vc-form-switch-disabled")}>
|
||||
<div className={"vc-form-switch-text"}>
|
||||
<Text variant="text-md/medium">{title}</Text>
|
||||
{description && <Text variant="text-sm/normal">{description}</Text>}
|
||||
</div>
|
||||
|
||||
<Switch checked={value} onChange={onChange} disabled={disabled} />
|
||||
</div>
|
||||
{!hideBorder && <FormDivider className="vc-form-switch-border" />}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
/** Compatibility with Discord's old FormSwitch */
|
||||
export function FormSwitchCompat(props: PropsWithChildren<any>) {
|
||||
return <FormSwitch {...props} title={props.children ?? ""} description={props.note} />;
|
||||
}
|
||||
|
|
@ -1,3 +1,3 @@
|
|||
.vc-switch-slider {
|
||||
transition: 100ms transform ease-in-out;
|
||||
}
|
||||
}
|
||||
|
|
@ -20,7 +20,7 @@ import "./AddonCard.css";
|
|||
|
||||
import { classNameFactory } from "@api/Styles";
|
||||
import { AddonBadge } from "@components/settings/PluginBadge";
|
||||
import { Switch } from "@components/settings/Switch";
|
||||
import { Switch } from "@components/Switch";
|
||||
import { Text, useRef } from "@webpack/common";
|
||||
import type { MouseEventHandler, ReactNode } from "react";
|
||||
|
||||
|
|
|
|||
|
|
@ -4,10 +4,10 @@
|
|||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
export * from "../Switch";
|
||||
export * from "./AddonCard";
|
||||
export * from "./DonateButton";
|
||||
export * from "./PluginBadge";
|
||||
export * from "./QuickAction";
|
||||
export * from "./SpecialCard";
|
||||
export * from "./Switch";
|
||||
export * from "./tabs";
|
||||
|
|
|
|||
|
|
@ -4,8 +4,9 @@
|
|||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
import { FormSwitch } from "@components/FormSwitch";
|
||||
import { Margins } from "@utils/margins";
|
||||
import { Forms, Parser, Switch, TextInput, useEffect, useState } from "@webpack/common";
|
||||
import { Forms, Parser, TextInput, useEffect, useState } from "@webpack/common";
|
||||
|
||||
const RegexGuide = {
|
||||
"\\i": "Special regex escape sequence that matches identifiers (varnames, classnames, etc.)",
|
||||
|
|
@ -69,15 +70,14 @@ export function ReplacementInput({ replacement, setReplacement, replacementError
|
|||
</div>
|
||||
)}
|
||||
|
||||
<Switch
|
||||
<FormSwitch
|
||||
className={Margins.top16}
|
||||
value={isFunc}
|
||||
onChange={setIsFunc}
|
||||
note="'replacement' will be evaled if this is toggled"
|
||||
title={"Treat as Function"}
|
||||
description="'replacement' will be evaled if this is toggled"
|
||||
hideBorder
|
||||
>
|
||||
Treat as Function
|
||||
</Switch>
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import { Switch } from "@components/settings/Switch";
|
||||
import { Switch } from "@components/Switch";
|
||||
import { PluginOptionBoolean } from "@utils/types";
|
||||
import { React, useState } from "@webpack/common";
|
||||
|
||||
|
|
|
|||
|
|
@ -19,13 +19,14 @@
|
|||
import { showNotification } from "@api/Notifications";
|
||||
import { Settings, useSettings } from "@api/Settings";
|
||||
import { CheckedTextInput } from "@components/CheckedTextInput";
|
||||
import { FormSwitch } from "@components/FormSwitch";
|
||||
import { Grid } from "@components/Grid";
|
||||
import { Link } from "@components/Link";
|
||||
import { SettingsTab, wrapTab } from "@components/settings/tabs/BaseTab";
|
||||
import { authorizeCloud, cloudLogger, deauthorizeCloud, getCloudAuth, getCloudUrl } from "@utils/cloud";
|
||||
import { Margins } from "@utils/margins";
|
||||
import { deleteCloudSettings, getCloudSettings, putCloudSettings } from "@utils/settingsSync";
|
||||
import { Alerts, Button, Forms, Switch, Tooltip, useState } from "@webpack/common";
|
||||
import { Alerts, Button, Forms, Tooltip, useState } from "@webpack/common";
|
||||
|
||||
function validateUrl(url: string) {
|
||||
try {
|
||||
|
|
@ -72,14 +73,13 @@ function SettingsSyncSection() {
|
|||
Synchronize your settings to the cloud. This allows easy synchronization across multiple devices with
|
||||
minimal effort.
|
||||
</Forms.FormText>
|
||||
<Switch
|
||||
<FormSwitch
|
||||
key="cloud-sync"
|
||||
disabled={!cloud.authenticated}
|
||||
title="Settings Sync"
|
||||
value={cloud.settingsSync}
|
||||
onChange={v => { cloud.settingsSync = v; }}
|
||||
>
|
||||
Settings Sync
|
||||
</Switch>
|
||||
disabled={!cloud.authenticated}
|
||||
/>
|
||||
<div className="vc-cloud-settings-sync-grid">
|
||||
<Button
|
||||
size={Button.Sizes.SMALL}
|
||||
|
|
@ -143,8 +143,10 @@ function CloudTab() {
|
|||
<br />
|
||||
You can swap between Equicord and Vencord's different cloud instances below if needed.
|
||||
</Forms.FormText>
|
||||
<Switch
|
||||
<FormSwitch
|
||||
key="backend"
|
||||
title="Enable Cloud Integrations"
|
||||
description="This will request authorization if you have not yet set up cloud integrations."
|
||||
value={settings.cloud.authenticated}
|
||||
onChange={v => {
|
||||
if (v)
|
||||
|
|
@ -152,10 +154,7 @@ function CloudTab() {
|
|||
else
|
||||
settings.cloud.authenticated = v;
|
||||
}}
|
||||
note="This will request authorization if you have not yet set up cloud integrations."
|
||||
>
|
||||
Enable Cloud Integrations
|
||||
</Switch>
|
||||
/>
|
||||
<Forms.FormTitle tag="h5">Backend URL</Forms.FormTitle>
|
||||
<Forms.FormText className={Margins.bottom8}>
|
||||
Which backend to use when using cloud integrations.
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
import { useSettings } from "@api/Settings";
|
||||
import { ErrorCard } from "@components/ErrorCard";
|
||||
import { Flex } from "@components/Flex";
|
||||
import { FormSwitch } from "@components/FormSwitch";
|
||||
import { Link } from "@components/Link";
|
||||
import { handleSettingsTabError, SettingsTab, wrapTab } from "@components/settings";
|
||||
import { Margins } from "@utils/margins";
|
||||
|
|
@ -27,7 +28,7 @@ import { ModalCloseButton, ModalContent, ModalProps, ModalRoot, ModalSize, openM
|
|||
import { relaunch } from "@utils/native";
|
||||
import { useAwaiter } from "@utils/react";
|
||||
import { changes, checkForUpdates, getRepo, isNewer, shortGitHash, update, updateError, UpdateLogger } from "@utils/updater";
|
||||
import { Alerts, Button, Card, Forms, Parser, React, Switch, Toasts } from "@webpack/common";
|
||||
import { Alerts, Button, Card, Forms, Parser, React, Toasts } from "@webpack/common";
|
||||
|
||||
import gitHash from "~git-hash";
|
||||
|
||||
|
|
@ -204,21 +205,19 @@ function Updater() {
|
|||
return (
|
||||
<SettingsTab title="Equicord Updater">
|
||||
<Forms.FormTitle tag="h5">Updater Settings</Forms.FormTitle>
|
||||
<Switch
|
||||
<FormSwitch
|
||||
title="Automatically update"
|
||||
description="Automatically update Equicord without confirmation prompt"
|
||||
value={settings.autoUpdate}
|
||||
onChange={(v: boolean) => settings.autoUpdate = v}
|
||||
note="Automatically update Equicord without confirmation prompt"
|
||||
>
|
||||
Automatically update
|
||||
</Switch>
|
||||
<Switch
|
||||
/>
|
||||
<FormSwitch
|
||||
value={settings.autoUpdateNotification}
|
||||
onChange={(v: boolean) => settings.autoUpdateNotification = v}
|
||||
note="Shows a notification when Equicord automatically updates"
|
||||
title="Get notified when an automatic update completes"
|
||||
description="Shows a notification when Equicord automatically updates"
|
||||
disabled={!settings.autoUpdate}
|
||||
>
|
||||
Get notified when an automatic update completes
|
||||
</Switch>
|
||||
/>
|
||||
|
||||
<Forms.FormTitle tag="h5">Repo</Forms.FormTitle>
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import "./VencordTab.css";
|
|||
|
||||
import { openNotificationLogModal } from "@api/Notifications/notificationLog";
|
||||
import { useSettings } from "@api/Settings";
|
||||
import { FormSwitch } from "@components/FormSwitch";
|
||||
import { FolderIcon, GithubIcon, LogIcon, PaintbrushIcon, RestartIcon } from "@components/Icons";
|
||||
import { openContributorModal, openPluginModal, SettingsTab, wrapTab } from "@components/settings";
|
||||
import { DonateButton, InviteButton } from "@components/settings/DonateButton";
|
||||
|
|
@ -18,7 +19,7 @@ import { DONOR_ROLE_ID, GUILD_ID, VC_DONOR_ROLE_ID, VC_GUILD_ID } from "@utils/c
|
|||
import { Margins } from "@utils/margins";
|
||||
import { identity, isAnyPluginDev } from "@utils/misc";
|
||||
import { relaunch } from "@utils/native";
|
||||
import { Button, Flex, Forms, GuildMemberStore, React, Select, Switch, UserStore } from "@webpack/common";
|
||||
import { Button, Flex, Forms, GuildMemberStore, React, Select, UserStore } from "@webpack/common";
|
||||
import BadgeAPI from "plugins/_api/badges";
|
||||
|
||||
import { openNotificationSettingsModal } from "./NotificationSettings";
|
||||
|
|
@ -210,11 +211,12 @@ function EquicordSettings() {
|
|||
{Switches.map(
|
||||
s =>
|
||||
s && (
|
||||
<Switch
|
||||
<FormSwitch
|
||||
key={s.key}
|
||||
value={settings[s.key]}
|
||||
onChange={v => (settings[s.key] = v)}
|
||||
note={
|
||||
title={s.title}
|
||||
description={
|
||||
s.warning.enabled ? (
|
||||
<>
|
||||
{s.note}
|
||||
|
|
@ -226,9 +228,7 @@ function EquicordSettings() {
|
|||
s.note
|
||||
)
|
||||
}
|
||||
>
|
||||
{s.title}
|
||||
</Switch>
|
||||
/>
|
||||
),
|
||||
)}
|
||||
</Forms.FormSection>
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import { FormSwitch } from "@components/FormSwitch";
|
||||
import { insertTextIntoChatInputBox } from "@utils/discord";
|
||||
import {
|
||||
ModalContent,
|
||||
|
|
@ -25,7 +26,7 @@ import {
|
|||
ModalRoot,
|
||||
openModal,
|
||||
} from "@utils/modal";
|
||||
import { Button, Forms, React, Switch, TextInput } from "@webpack/common";
|
||||
import { Button, Forms, React, TextInput } from "@webpack/common";
|
||||
|
||||
import { encrypt } from "../index";
|
||||
|
||||
|
|
@ -65,14 +66,13 @@ function EncModal(props: ModalProps) {
|
|||
setPassword(e);
|
||||
}}
|
||||
/>
|
||||
<Switch
|
||||
<FormSwitch
|
||||
title="Don't use a Cover"
|
||||
value={noCover}
|
||||
onChange={(e: boolean) => {
|
||||
setNoCover(e);
|
||||
}}
|
||||
>
|
||||
Don't use a Cover
|
||||
</Switch>
|
||||
/>
|
||||
</ModalContent>
|
||||
|
||||
<ModalFooter>
|
||||
|
|
|
|||
|
|
@ -16,9 +16,10 @@
|
|||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import { FormSwitch } from "@components/FormSwitch";
|
||||
import { Margins } from "@utils/margins";
|
||||
import { ModalCloseButton, ModalContent, ModalHeader, ModalProps, ModalRoot } from "@utils/modal";
|
||||
import { Forms, SearchableSelect, Switch, useMemo } from "@webpack/common";
|
||||
import { Forms, SearchableSelect, useMemo } from "@webpack/common";
|
||||
|
||||
import { settings } from "./settings";
|
||||
import { cl, getLanguages } from "./utils";
|
||||
|
|
@ -60,14 +61,13 @@ function AutoTranslateToggle() {
|
|||
const value = settings.use(["autoTranslate"]).autoTranslate;
|
||||
|
||||
return (
|
||||
<Switch
|
||||
<FormSwitch
|
||||
title="Auto Translate"
|
||||
description={settings.def.autoTranslate.description}
|
||||
value={value}
|
||||
onChange={v => settings.store.autoTranslate = v}
|
||||
note={settings.def.autoTranslate.description}
|
||||
hideBorder
|
||||
>
|
||||
Auto Translate
|
||||
</Switch>
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import { FormSwitchCompat } from "@components/FormSwitch";
|
||||
import { LazyComponent } from "@utils/lazyReact";
|
||||
import * as t from "@vencord/discord-types";
|
||||
import { filters, mapMangledModuleLazy, waitFor } from "@webpack";
|
||||
|
|
@ -37,7 +38,8 @@ export const Forms = {
|
|||
|
||||
export const Card = waitForComponent<t.Card>("Card", filters.componentByCode(".editable),", ".outline:"));
|
||||
export const Button = waitForComponent<t.Button>("Button", filters.componentByCode("#{intl::A11Y_LOADING_STARTED}))),!1"));
|
||||
export const Switch = waitForComponent<t.Switch>("Switch", filters.componentByCode(".labelRow,ref:", ".disabledText"));
|
||||
/** @deprecated Use FormSwitch from Vencord */
|
||||
export const Switch = FormSwitchCompat as never;
|
||||
export const Checkbox = waitForComponent<t.Checkbox>("Checkbox", filters.componentByCode(".checkboxWrapperDisabled:"));
|
||||
|
||||
const Tooltips = mapMangledModuleLazy(".tooltipTop,bottom:", {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue