diff options
author | Justice Almanzar <superdash993@gmail.com> | 2023-02-28 00:12:35 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-28 06:12:35 +0100 |
commit | 5ec517875e0725b66805b939e5379c23a5e40ceb (patch) | |
tree | 1cd28f024994b581a2173994165ba86d532b2578 | |
parent | cf56ad985b94e76f79348b8af45e648aa36ef144 (diff) | |
download | Vencord-5ec517875e0725b66805b939e5379c23a5e40ceb.tar.gz Vencord-5ec517875e0725b66805b939e5379c23a5e40ceb.tar.bz2 Vencord-5ec517875e0725b66805b939e5379c23a5e40ceb.zip |
typings for defaultless settings (#512)
* typings for defaultless settings
* fix other silly typings
* type guard utils
---------
Co-authored-by: Ven <vendicated@riseup.net>
-rw-r--r-- | src/plugins/customRPC.tsx | 21 | ||||
-rw-r--r-- | src/plugins/lastfm.tsx | 6 | ||||
-rw-r--r-- | src/utils/guards.ts | 25 | ||||
-rw-r--r-- | src/utils/types.ts | 5 |
4 files changed, 42 insertions, 15 deletions
diff --git a/src/plugins/customRPC.tsx b/src/plugins/customRPC.tsx index 9a0901b..fe6d574 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<string>; @@ -70,7 +71,7 @@ interface Activity { button_urls?: Array<string>; }; 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 = <T,>(description: string, options: T) => ({ type: OptionType.SELECT, description, onChange: setRpc, @@ -173,13 +174,13 @@ async function createActivity(): Promise<Activity | undefined> { 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<Activity | undefined> { 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 bf3f63c..9a0647c 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<string>; @@ -43,8 +43,8 @@ interface Activity { metadata?: { button_urls?: Array<string>; }; - 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 0000000..499f4b8 --- /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 <https://www.gnu.org/licenses/>. +*/ + +export function isTruthy<T>(item: T): item is Exclude<T, 0 | "" | false | null | undefined> { + return Boolean(item); +} + +export function isNonNullish<T>(item: T): item is Exclude<T, null | undefined> { + return item != null; +} diff --git a/src/utils/types.ts b/src/utils/types.ts index 5ab6857..24915a6 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -229,9 +229,12 @@ type PluginSettingType<O extends PluginSettingDef> = O extends PluginSettingStri O extends PluginSettingSliderDef ? number : O extends PluginSettingComponentDef ? any : never; +type PluginSettingDefaultType<O extends PluginSettingDef> = O extends PluginSettingSelectDef ? ( + O["options"] extends { default?: boolean; }[] ? O["options"][number]["value"] : undefined +) : O extends { default: infer T; } ? T : undefined; type SettingsStore<D extends SettingsDefinition> = { - [K in keyof D]: PluginSettingType<D[K]>; + [K in keyof D]: PluginSettingType<D[K]> | PluginSettingDefaultType<D[K]>; }; /** An instance of defined plugin settings */ |