/* * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors */ import "./settings.css"; import { Forms, Switch, Text } from "@vencord/types/webpack/common"; import { ComponentType } from "react"; import { Settings, useSettings } from "renderer/settings"; import { isMac, isWindows } from "renderer/utils"; import { AutoStartToggle } from "./AutoStartToggle"; import { DiscordBranchPicker } from "./DiscordBranchPicker"; import { NotificationBadgeToggle } from "./NotificationBadgeToggle"; import { CustomizeTraySwitch, TrayColorTypeSelect, TrayFillColorSwitch, TrayIconPicker, TraySwitch } from "./TraySettings"; import { VencordLocationPicker } from "./VencordLocationPicker"; import { WindowsTransparencyControls } from "./WindowsTransparencyControls"; interface BooleanSetting { key: keyof typeof Settings.store; title: string; description: string; defaultValue: boolean; disabled?(): boolean; invisible?(): boolean; } export type SettingsComponent = ComponentType<{ settings: typeof Settings.store }>; const SettingsOptions: Record> = { "Discord Branch": [DiscordBranchPicker], "System Startup & Performance": [ AutoStartToggle, { key: "hardwareAcceleration", title: "Hardware Acceleration", description: "Enable hardware acceleration", defaultValue: true } ], "User Interface": [ { key: "customTitleBar", title: "Discord Titlebar", description: "Use Discord's custom title bar instead of the native system one. Requires a full restart.", defaultValue: isWindows }, { key: "staticTitle", title: "Static Title", description: 'Makes the window title "Vesktop" instead of changing to the current page', defaultValue: false }, { key: "enableMenu", title: "Enable Menu Bar", description: "Enables the application menu bar. Press ALT to toggle visibility.", defaultValue: false, disabled: () => Settings.store.customTitleBar ?? isWindows }, { key: "splashTheming", title: "Splash theming", description: "Adapt the splash window colors to your custom theme", defaultValue: false }, WindowsTransparencyControls ], Tray: [ TraySwitch, CustomizeTraySwitch, TrayColorTypeSelect, TrayIconPicker, TrayFillColorSwitch, { key: "minimizeToTray", title: "Minimize to tray", description: "Hitting X will make Vesktop minimize to the tray instead of closing", defaultValue: true, invisible: () => isMac || Settings.store.tray === false }, { key: "clickTrayToShowHide", title: "Hide/Show on tray click", description: "Left clicking tray icon will toggle the vesktop window visibility.", defaultValue: false, invisible: () => Settings.store.tray === false } ], Behaviour: [ { key: "disableMinSize", title: "Disable minimum window size", description: "Allows you to make the window as small as your heart desires", defaultValue: false }, { key: "disableSmoothScroll", title: "Disable smooth scrolling", description: "Disables smooth scrolling", defaultValue: false } ], Notifications: [NotificationBadgeToggle], Miscelleanous: [ { key: "arRPC", title: "Rich Presence", description: "Enables Rich Presence via arRPC", defaultValue: false }, { key: "openLinksWithElectron", title: "Open Links in app (experimental)", description: "Opens links in a new Vesktop window instead of your web browser", defaultValue: false } ], "Vencord Location": [VencordLocationPicker] }; function SettingsSections() { const Settings = useSettings(); const sections = Object.entries(SettingsOptions).map(([title, settings]) => ( {settings.map(Setting => { if (typeof Setting === "function") return ; const { defaultValue, title, description, key, disabled, invisible } = Setting; if (invisible?.()) return null; return ( (Settings[key as any] = v)} note={description} disabled={disabled?.()} key={key} > {title} ); })} )); return <>{sections}; } export default function SettingsUi() { return ( Vesktop Settings ); }