aboutsummaryrefslogtreecommitdiff
path: root/src/components
diff options
context:
space:
mode:
authorVen <vendicated@riseup.net>2023-02-10 22:33:34 +0100
committerGitHub <noreply@github.com>2023-02-10 22:33:34 +0100
commit1d995e58f515dbeb908ba34bf70f829bfd3ccfac (patch)
treedf8c540f5656028502288ab4e58e41754f723bc9 /src/components
parent6114bc6b168607613d06ae8fb4f29e74c763a417 (diff)
downloadVencord-1d995e58f515dbeb908ba34bf70f829bfd3ccfac.tar.gz
Vencord-1d995e58f515dbeb908ba34bf70f829bfd3ccfac.tar.bz2
Vencord-1d995e58f515dbeb908ba34bf70f829bfd3ccfac.zip
Notification API (#467)
Co-authored-by: Ven <vendicated@riseup.net> Co-authored-by: afn <hey@afn.lol> Co-authored-by: afn <afnzmn@gmail.com>
Diffstat (limited to 'src/components')
-rw-r--r--src/components/VencordSettings/VencordTab.tsx149
1 files changed, 104 insertions, 45 deletions
diff --git a/src/components/VencordSettings/VencordTab.tsx b/src/components/VencordSettings/VencordTab.tsx
index 9f55d57..6ea1ca9 100644
--- a/src/components/VencordSettings/VencordTab.tsx
+++ b/src/components/VencordSettings/VencordTab.tsx
@@ -22,22 +22,63 @@ import { classNameFactory } from "@api/Styles";
import DonateButton from "@components/DonateButton";
import ErrorBoundary from "@components/ErrorBoundary";
import IpcEvents from "@utils/IpcEvents";
-import { useAwaiter } from "@utils/misc";
-import { Button, Card, Forms, Margins, React, Switch } from "@webpack/common";
+import { Margins } from "@utils/margins";
+import { identity, useAwaiter } from "@utils/misc";
+import { Button, Card, Forms, React, Select, Slider, Switch } from "@webpack/common";
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<Object, Type> = {
+ [K in keyof Object]: Object[K] extends Type ? K : never;
+}[keyof Object];
+
function VencordSettings() {
const [settingsDir, , settingsDirPending] = useAwaiter(() => VencordNative.ipc.invoke<string>(IpcEvents.GET_SETTINGS_DIR), {
fallbackValue: "Loading..."
});
const settings = useSettings();
+ const notifSettings = settings.notifications;
const donateImage = React.useMemo(() => Math.random() > 0.5 ? DEFAULT_DONATE_IMAGE : SHIGGY_DONATE_IMAGE, []);
+ const isWindows = navigator.platform.toLowerCase().startsWith("win");
+
+ const Switches: Array<false | {
+ key: KeysOfType<typeof settings, boolean>;
+ 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 && !isWindows && {
+ key: "frameless",
+ title: "Disable the window frame",
+ note: "Requires a full restart"
+ },
+ !IS_WEB && {
+ 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"
+ }
+ ];
+
return (
<React.Fragment>
<DonateCard image={donateImage} />
@@ -82,52 +123,70 @@ function VencordSettings() {
<Forms.FormDivider />
- <Forms.FormSection className={Margins.marginTop16} title="Settings">
- <Forms.FormText className={Margins.marginBottom20}>
+ <Forms.FormSection className={Margins.top16} title="Settings" tag="h5">
+ <Forms.FormText className={Margins.bottom20}>
Hint: You can change the position of this settings section in the settings of the "Settings" plugin!
</Forms.FormText>
- <Switch
- value={settings.useQuickCss}
- onChange={(v: boolean) => settings.useQuickCss = v}
- note="Loads styles from your QuickCSS file">
- Use QuickCSS
- </Switch>
- {!IS_WEB && (
- <React.Fragment>
- <Switch
- value={settings.enableReactDevtools}
- onChange={(v: boolean) => settings.enableReactDevtools = v}
- note="Requires a full restart"
- >
- Enable React Developer Tools
- </Switch>
- <Switch
- value={settings.frameless}
- onChange={(v: boolean) => settings.frameless = v}
- note="Requires a full restart"
- >
- Disable the window frame
- </Switch>
- <Switch
- value={settings.transparent}
- onChange={(v: boolean) => settings.transparent = v}
- note="Requires a full restart"
- >
- Enable window transparency
- </Switch>
- {navigator.platform.toLowerCase().startsWith("win") && (
- <Switch
- value={settings.winCtrlQ}
- onChange={(v: boolean) => settings.winCtrlQ = v}
- note="Requires a full restart"
- >
- Register Ctrl+Q as shortcut to close Discord (Alternative to Alt+F4)
- </Switch>
- )}
- </React.Fragment>
- )}
-
+ {Switches.map(s => s && (
+ <Switch
+ key={s.key}
+ value={settings[s.key]}
+ onChange={v => settings[s.key] = v}
+ note={s.note}
+ >
+ {s.title}
+ </Switch>
+ ))}
</Forms.FormSection>
+
+
+ <Forms.FormTitle tag="h5">Notification Style</Forms.FormTitle>
+ <Forms.FormText className={Margins.bottom8}>
+ Some plugins may show you notifications. These come in two styles:
+ <ul>
+ <li><strong>Vencord Notifications</strong>: These are in-app notifications</li>
+ <li><strong>Desktop Notifications</strong>: Native Desktop notifications (like when you get a ping)</li>
+ </ul>
+ </Forms.FormText>
+ <Select
+ placeholder="Notification Style"
+ options={[
+ { label: "Only use Desktop notifications when Discord is not focused", value: "not-focused", default: true },
+ { label: "Always use Desktop notifications", value: "always" },
+ { label: "Always use Vencord notifications", value: "never" },
+ ]satisfies Array<{ value: typeof settings["notifications"]["useNative"]; } & Record<string, any>>}
+ closeOnSelect={true}
+ select={v => notifSettings.useNative = v}
+ isSelected={v => v === notifSettings.useNative}
+ serialize={identity}
+ />
+
+ <Forms.FormTitle tag="h5" className={Margins.top16 + " " + Margins.bottom8}>Notification Position</Forms.FormTitle>
+ <Select
+ isDisabled={notifSettings.useNative === "always"}
+ placeholder="Notification Position"
+ options={[
+ { label: "Bottom Right", value: "bottom-right", default: true },
+ { label: "Top Right", value: "top-right" },
+ ]satisfies Array<{ value: typeof settings["notifications"]["position"]; } & Record<string, any>>}
+ select={v => notifSettings.position = v}
+ isSelected={v => v === notifSettings.position}
+ serialize={identity}
+ />
+
+ <Forms.FormTitle tag="h5" className={Margins.top16 + " " + Margins.bottom8}>Notification Timeout</Forms.FormTitle>
+ <Forms.FormText className={Margins.bottom16}>Set to 0s to never automatically time out</Forms.FormText>
+ <Slider
+ disabled={notifSettings.useNative === "always"}
+ markers={[0, 1000, 2500, 5000, 10_000, 20_000]}
+ minValue={0}
+ maxValue={20_000}
+ initialValue={notifSettings.timeout}
+ onValueChange={v => notifSettings.timeout = v}
+ onValueRender={v => (v / 1000).toFixed(2) + "s"}
+ onMarkerRender={v => (v / 1000) + "s"}
+ stickToMarkers={false}
+ />
</React.Fragment>
);
}