From 5ec517875e0725b66805b939e5379c23a5e40ceb Mon Sep 17 00:00:00 2001 From: Justice Almanzar Date: Tue, 28 Feb 2023 00:12:35 -0500 Subject: [PATCH] typings for defaultless settings (#512) * typings for defaultless settings * fix other silly typings * type guard utils --------- Co-authored-by: Ven --- src/plugins/customRPC.tsx | 21 ++++++++++----------- src/plugins/lastfm.tsx | 6 +++--- src/utils/guards.ts | 25 +++++++++++++++++++++++++ src/utils/types.ts | 5 ++++- 4 files changed, 42 insertions(+), 15 deletions(-) create mode 100644 src/utils/guards.ts diff --git a/src/plugins/customRPC.tsx b/src/plugins/customRPC.tsx index 9a0901b76..fe6d574db 100644 --- a/src/plugins/customRPC.tsx +++ b/src/plugins/customRPC.tsx @@ -19,6 +19,7 @@ import { definePluginSettings } from "@api/settings"; import { Link } from "@components/Link"; import { Devs } from "@utils/constants"; +import { isTruthy } from "@utils/guards"; import { useAwaiter } from "@utils/misc"; import definePlugin, { OptionType } from "@utils/types"; import { filters, findByCodeLazy, findByPropsLazy, mapMangledModuleLazy } from "@webpack"; @@ -56,11 +57,11 @@ interface ActivityAssets { } interface Activity { - state: string; + state?: string; details?: string; timestamps?: { - start?: Number; - end?: Number; + start?: number; + end?: number; }; assets?: ActivityAssets; buttons?: Array; @@ -70,7 +71,7 @@ interface Activity { button_urls?: Array; }; type: ActivityType; - flags: Number; + flags: number; } enum ActivityType { @@ -93,13 +94,13 @@ const numOpt = (description: string) => ({ onChange: setRpc }) as const; -const choice = (label: string, value: any, _default?: Boolean) => ({ +const choice = (label: string, value: any, _default?: boolean) => ({ label, value, default: _default }) as const; -const choiceOpt = (description: string, options) => ({ +const choiceOpt = (description: string, options: T) => ({ type: OptionType.SELECT, description, onChange: setRpc, @@ -173,13 +174,13 @@ async function createActivity(): Promise { activity.buttons = [ buttonOneText, buttonTwoText - ].filter(Boolean); + ].filter(isTruthy); activity.metadata = { button_urls: [ buttonOneURL, buttonTwoURL - ].filter(Boolean) + ].filter(isTruthy) }; } @@ -206,12 +207,10 @@ async function createActivity(): Promise { delete activity[k]; } - // WHAT DO YOU WANT FROM ME - // eslint-disable-next-line consistent-return return activity; } -async function setRpc(disable?: Boolean) { +async function setRpc(disable?: boolean) { const activity: Activity | undefined = await createActivity(); FluxDispatcher.dispatch({ diff --git a/src/plugins/lastfm.tsx b/src/plugins/lastfm.tsx index bf3f63c9e..9a0647c76 100644 --- a/src/plugins/lastfm.tsx +++ b/src/plugins/lastfm.tsx @@ -34,7 +34,7 @@ interface Activity { state: string; details?: string; timestamps?: { - start?: Number; + start?: number; }; assets?: ActivityAssets; buttons?: Array; @@ -43,8 +43,8 @@ interface Activity { metadata?: { button_urls?: Array; }; - type: Number; - flags: Number; + type: number; + flags: number; } interface TrackData { diff --git a/src/utils/guards.ts b/src/utils/guards.ts new file mode 100644 index 000000000..499f4b83e --- /dev/null +++ b/src/utils/guards.ts @@ -0,0 +1,25 @@ +/* + * Vencord, a modification for Discord's desktop app + * Copyright (c) 2023 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 . +*/ + +export function isTruthy(item: T): item is Exclude { + return Boolean(item); +} + +export function isNonNullish(item: T): item is Exclude { + return item != null; +} diff --git a/src/utils/types.ts b/src/utils/types.ts index 5ab685761..24915a6e0 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -229,9 +229,12 @@ type PluginSettingType = O extends PluginSettingStri O extends PluginSettingSliderDef ? number : O extends PluginSettingComponentDef ? any : never; +type PluginSettingDefaultType = O extends PluginSettingSelectDef ? ( + O["options"] extends { default?: boolean; }[] ? O["options"][number]["value"] : undefined +) : O extends { default: infer T; } ? T : undefined; type SettingsStore = { - [K in keyof D]: PluginSettingType; + [K in keyof D]: PluginSettingType | PluginSettingDefaultType; }; /** An instance of defined plugin settings */