Improve settings default handling

This commit is contained in:
Vendicated
2026-08-24 14:40:50 +02:00
parent 09ce424b30
commit fd7ada3cd8
14 changed files with 123 additions and 78 deletions
+1 -1
View File
@@ -14,7 +14,7 @@ let GuildReadStateStore: any;
let NotificationSettingsStore: any;
export function setBadge() {
if (Settings.store.appBadge === false) return;
if (!Settings.store.appBadge) return;
try {
const mentionCount = GuildReadStateStore.getTotalMentionCount();
@@ -27,7 +27,7 @@ export const AutoStartToggle: SettingsComponent = ({ settings }) => {
<VesktopSettingsSwitch
title="Auto Start Minimized"
description={"Start Vesktop minimized when starting with system"}
value={settings.autoStartMinimized ?? false}
value={settings.autoStartMinimized}
onChange={v => (settings.autoStartMinimized = v)}
disabled={!autoStartEnabled}
/>
@@ -14,7 +14,7 @@ export const NotificationBadgeToggle: SettingsComponent = ({ settings }) => {
<VesktopSettingsSwitch
title="Notification Badge"
description="Show mention badge on the app icon"
value={settings.appBadge ?? true}
value={settings.appBadge}
onChange={v => {
settings.appBadge = v;
if (v) setBadge();
+16 -35
View File
@@ -10,7 +10,7 @@ import { classNameFactory } from "@vencord/types/api/Styles";
import { BaseText, Divider, ErrorBoundary } from "@vencord/types/components";
import { ComponentType } from "react";
import { WebRTCIPHandlingPolicyPicker } from "renderer/components/settings/WebRTCIPHandlingPolicyPicker";
import { Settings, useSettings } from "renderer/settings";
import { getValueAndOnChange, Settings, useSettings } from "renderer/settings";
import { isMac } from "renderer/utils";
import { AutoStartToggle } from "./AutoStartToggle";
@@ -26,7 +26,6 @@ interface BooleanSetting {
key: keyof typeof Settings.store;
title: string;
description: string;
defaultValue: boolean;
disabled?(): boolean;
invisible?(): boolean;
}
@@ -42,64 +41,55 @@ const SettingsOptions: Record<string, Array<BooleanSetting | SettingsComponent>>
{
key: "hardwareAcceleration",
title: "Hardware Acceleration",
description: "Enable hardware acceleration",
defaultValue: true
description: "Enable hardware acceleration"
},
{
key: "hardwareVideoAcceleration",
title: "Video Hardware Acceleration",
description:
"Enable hardware video acceleration. This can improve performance of screenshare and video playback, but may cause graphical glitches and infinitely loading streams.",
defaultValue: false,
disabled: () => Settings.store.hardwareAcceleration === false
disabled: () => !Settings.store.hardwareAcceleration
}
],
"User Interface": [
{
key: "nativeTitleBar",
title: "Native Titlebar",
description: "Enable the system titlebar in addition to Discord's custom one. Requires a full restart.",
defaultValue: false
description: "Enable the system titlebar in addition to Discord's custom one. Requires a full restart."
},
{
key: "staticTitle",
title: "Static Title",
description: 'Makes the window title "Vesktop" instead of changing to the current page',
defaultValue: false
description: 'Makes the window title "Vesktop" instead of changing to the current page'
},
{
key: "enableMenu",
title: "Enable Menu Bar",
description: "Enables the application menu bar. Press ALT to toggle visibility.",
defaultValue: false,
disabled: () => Settings.store.nativeTitleBar !== true
},
{
key: "enableShadow",
title: "Enable Window Shadow",
description: "Enables the window shadow. Requires a full restart.",
defaultValue: true,
disabled: () => Settings.store.nativeTitleBar === true
},
{
key: "enableRoundedCorners",
title: "Enable Rounded Corners",
description: "Enables rounded corners. Requires a full restart.",
defaultValue: true,
disabled: () => Settings.store.nativeTitleBar === true
},
{
key: "enableSplashScreen",
title: "Enable Splash Screen",
description:
"Shows a small splash screen while Vesktop is loading. Disabling this option will show the main window earlier while it's still loading.",
defaultValue: true
"Shows a small splash screen while Vesktop is loading. Disabling this option will show the main window earlier while it's still loading."
},
{
key: "splashTheming",
title: "Splash theming",
description: "Adapt the splash window colors to your custom theme",
defaultValue: true
description: "Adapt the splash window colors to your custom theme"
},
WindowsTransparencyControls,
UserAssetsButton
@@ -109,34 +99,29 @@ const SettingsOptions: Record<string, Array<BooleanSetting | SettingsComponent>>
key: "tray",
title: "Tray Icon",
description: "Add a tray icon for Vesktop",
defaultValue: true,
invisible: () => isMac
},
{
key: "minimizeToTray",
title: "Minimize to tray",
description: "Hitting X will make Vesktop minimize to the tray instead of closing",
defaultValue: true,
invisible: () => isMac,
disabled: () => Settings.store.tray === false
disabled: () => !Settings.store.tray
},
{
key: "clickTrayToShowHide",
title: "Hide/Show on tray click",
description: "Left clicking tray icon will toggle the vesktop window visibility.",
defaultValue: false
description: "Left clicking tray icon will toggle the vesktop window visibility."
},
{
key: "disableMinSize",
title: "Disable minimum window size",
description: "Allows you to make the window as small as your heart desires",
defaultValue: false
description: "Allows you to make the window as small as your heart desires"
},
{
key: "disableSmoothScroll",
title: "Disable smooth scrolling",
description: "Disables smooth scrolling",
defaultValue: false
description: "Disables smooth scrolling"
}
],
Notifications: [
@@ -144,23 +129,20 @@ const SettingsOptions: Record<string, Array<BooleanSetting | SettingsComponent>>
{
key: "enableTaskbarFlashing",
title: "Enable Taskbar Flashing",
description: "Flashes the app in your taskbar when you have new notifications.",
defaultValue: false
description: "Flashes the app in your taskbar when you have new notifications."
}
],
Miscellaneous: [
{
key: "arRPC",
title: "Rich Presence",
description: "Enables Rich Presence via arRPC",
defaultValue: false
description: "Enables Rich Presence via arRPC"
},
{
key: "openLinksWithElectron",
title: "Open Links in app (experimental)",
description: "Opens links in a new Vesktop window instead of your web browser",
defaultValue: false
description: "Opens links in a new Vesktop window instead of your web browser"
},
WebRTCIPHandlingPolicyPicker
@@ -182,16 +164,15 @@ function SettingsSections() {
{settings.map((Setting, i) => {
if (typeof Setting === "function") return <Setting key={`Custom-${i}`} settings={Settings} />;
const { defaultValue, title, description, key, disabled, invisible } = Setting;
const { title, description, key, disabled, invisible } = Setting;
if (invisible?.()) return null;
return (
<VesktopSettingsSwitch
title={title}
description={description}
value={Settings[key as any] ?? defaultValue}
onChange={v => (Settings[key as any] = v)}
disabled={disabled?.()}
{...getValueAndOnChange(key)}
key={key}
/>
);
@@ -74,7 +74,7 @@ function Asset({ asset }: { asset: UserAssetType }) {
{isSplash && (
<FormSwitch
title="Nearest-Neighbor Scaling (for pixel art)"
value={settings.splashPixelated ?? false}
value={settings.splashPixelated}
onChange={val => (settings.splashPixelated = val)}
className={Margins.top16}
hideBorder
@@ -33,7 +33,7 @@ export const WebRTCIPHandlingPolicyPicker: SettingsComponent = ({ settings }) =>
]}
closeOnSelect={true}
select={v => (settings.webRTCIPHandlingPolicy = v)}
isSelected={v => v === (settings.webRTCIPHandlingPolicy ?? "default")}
isSelected={v => v === settings.webRTCIPHandlingPolicy}
serialize={s => s}
/>
</div>
+5 -3
View File
@@ -25,10 +25,12 @@ export function useSettings() {
return Settings.store;
}
export function getValueAndOnChange(key: keyof typeof Settings.store) {
export function getValueAndOnChange<K extends keyof typeof Settings.store, V extends (typeof Settings.store)[K]>(
key: K
) {
return {
value: Settings.store[key] as any,
onChange: (value: any) => (Settings.store[key] = value)
value: Settings.store[key] as V,
onChange: (value: V) => (Settings.store[key] = value)
};
}