/* * Vencord, a modification for Discord's desktop app * Copyright (c) 2022 Vendicated and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import { openNotificationLogModal } from "@api/Notifications/notificationLog"; import { Settings, useSettings } from "@api/Settings"; import { classNameFactory } from "@api/Styles"; import DonateButton from "@components/DonateButton"; import { ErrorCard } from "@components/ErrorCard"; import { Margins } from "@utils/margins"; import { identity } from "@utils/misc"; import { relaunch, showItemInFolder } from "@utils/native"; import { useAwaiter } from "@utils/react"; import { Button, Card, Forms, React, Select, Slider, Switch } from "@webpack/common"; import { SettingsTab, wrapTab } from "./shared"; const cl = classNameFactory("vc-settings-"); const DEFAULT_DONATE_IMAGE = "https://cdn.discordapp.com/emojis/1026533090627174460.png"; const SHIGGY_DONATE_IMAGE = "https://media.discordapp.net/stickers/1039992459209490513.png"; type KeysOfType = { [K in keyof Object]: Object[K] extends Type ? K : never; }[keyof Object]; function VencordSettings() { const [settingsDir, , settingsDirPending] = useAwaiter(VencordNative.settings.getSettingsDir, { fallbackValue: "Loading..." }); const settings = useSettings(); const donateImage = React.useMemo(() => Math.random() > 0.5 ? DEFAULT_DONATE_IMAGE : SHIGGY_DONATE_IMAGE, []); const isWindows = navigator.platform.toLowerCase().startsWith("win"); const isMac = navigator.platform.toLowerCase().startsWith("mac"); const needsVibrancySettings = IS_DISCORD_DESKTOP && isMac; // One-time migration of the old setting to the new one if necessary. React.useEffect(() => { if (settings.macosTranslucency === true && !settings.macosVibrancyStyle) { settings.macosVibrancyStyle = "sidebar"; settings.macosTranslucency = undefined; } }, []); const Switches: Array; title: string; note: string; }> = [ { key: "useQuickCss", title: "Enable Custom CSS", note: "Loads your Custom CSS" }, !IS_WEB && { key: "enableReactDevtools", title: "Enable React Developer Tools", note: "Requires a full restart" }, !IS_WEB && (!IS_DISCORD_DESKTOP || !isWindows ? { key: "frameless", title: "Disable the window frame", note: "Requires a full restart" } : { key: "winNativeTitleBar", title: "Use Windows' native title bar instead of Discord's custom one", note: "Requires a full restart" }), !IS_WEB && false /* This causes electron to freeze / white screen for some people */ && { key: "transparent", title: "Enable window transparency", note: "Requires a full restart" }, !IS_WEB && isWindows && { key: "winCtrlQ", title: "Register Ctrl+Q as shortcut to close Discord (Alternative to Alt+F4)", note: "Requires a full restart" }, IS_DISCORD_DESKTOP && { key: "disableMinSize", title: "Disable minimum window size", note: "Requires a full restart" }, ]; return ( {!IS_WEB && ( )} {!IS_WEB && ( )} Hint: You can change the position of this settings section in the settings of the "Settings" plugin! {Switches.map(s => s && ( settings[s.key] = v} note={s.note} > {s.title} ))} {needsVibrancySettings && <> Window vibrancy style (requires restart) >} closeOnSelect={true} select={v => settings.useNative = v} isSelected={v => v === settings.useNative} serialize={identity} /> Notification Position