diff --git a/src/components/PluginSettings/components/SettingTextComponent.tsx b/src/components/PluginSettings/components/SettingTextComponent.tsx index 9eccb10f..abf1bbbe 100644 --- a/src/components/PluginSettings/components/SettingTextComponent.tsx +++ b/src/components/PluginSettings/components/SettingTextComponent.tsx @@ -33,11 +33,10 @@ export function SettingTextComponent({ option, pluginSettings, definedSettings, const isValid = option.isValid?.call(definedSettings, newValue) ?? true; if (typeof isValid === "string") setError(isValid); else if (!isValid) setError("Invalid input provided."); - else { - setError(null); - setState(newValue); - onChange(newValue); - } + else setError(null); + + setState(newValue); + onChange(newValue); } return ( diff --git a/src/plugins/customRPC.tsx b/src/plugins/customRPC.tsx index 5a8a9aac..a58e5426 100644 --- a/src/plugins/customRPC.tsx +++ b/src/plugins/customRPC.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import { definePluginSettings } from "@api/Settings"; +import { definePluginSettings, Settings } from "@api/Settings"; import { Link } from "@components/Link"; import { Devs } from "@utils/constants"; import { isTruthy } from "@utils/guards"; @@ -86,8 +86,7 @@ const settings = definePluginSettings({ appID: { type: OptionType.STRING, description: "Application ID (required)", - restartNeeded: true, - onChange: setRpc, + onChange: onChange, isValid: (value: string) => { if (!value) return "Application ID is required."; if (value && !/^\d+$/.test(value)) return "Application ID must be a number."; @@ -97,8 +96,7 @@ const settings = definePluginSettings({ appName: { type: OptionType.STRING, description: "Application name (required)", - restartNeeded: true, - onChange: setRpc, + onChange: onChange, isValid: (value: string) => { if (!value) return "Application name is required."; if (value.length > 128) return "Application name must be not longer than 128 characters."; @@ -108,8 +106,7 @@ const settings = definePluginSettings({ details: { type: OptionType.STRING, description: "Details (line 1)", - restartNeeded: true, - onChange: setRpc, + onChange: onChange, isValid: (value: string) => { if (value && value.length > 128) return "Details (line 1) must be not longer than 128 characters."; return true; @@ -118,8 +115,7 @@ const settings = definePluginSettings({ state: { type: OptionType.STRING, description: "State (line 2)", - restartNeeded: true, - onChange: setRpc, + onChange: onChange, isValid: (value: string) => { if (value && value.length > 128) return "State (line 2) must be not longer than 128 characters."; return true; @@ -128,8 +124,7 @@ const settings = definePluginSettings({ type: { type: OptionType.SELECT, description: "Activity type", - restartNeeded: true, - onChange: setRpc, + onChange: onChange, options: [ { label: "Playing", @@ -157,16 +152,14 @@ const settings = definePluginSettings({ streamLink: { type: OptionType.STRING, description: "Twitch.tv or Youtube.com link (only for Streaming activity type)", - restartNeeded: true, - onChange: setRpc, - isDisabled: isStreamLinkDisabled, + onChange: onChange, + disabled: isStreamLinkDisabled, isValid: isStreamLinkValid }, timestampMode: { type: OptionType.SELECT, description: "Timestamp mode", - restartNeeded: true, - onChange: setRpc, + onChange: onChange, options: [ { label: "None", @@ -190,9 +183,8 @@ const settings = definePluginSettings({ startTime: { type: OptionType.NUMBER, description: "Start timestamp (only for custom timestamp mode)", - restartNeeded: true, - onChange: setRpc, - isDisabled: isTimestampDisabled, + onChange: onChange, + disabled: isTimestampDisabled, isValid: (value: number) => { if (value && value < 0) return "Start timestamp must be greater than 0."; return true; @@ -201,9 +193,8 @@ const settings = definePluginSettings({ endTime: { type: OptionType.NUMBER, description: "End timestamp (only for custom timestamp mode)", - restartNeeded: true, - onChange: setRpc, - isDisabled: isTimestampDisabled, + onChange: onChange, + disabled: isTimestampDisabled, isValid: (value: number) => { if (value && value < 0) return "End timestamp must be greater than 0."; return true; @@ -211,16 +202,14 @@ const settings = definePluginSettings({ }, imageBig: { type: OptionType.STRING, - description: "Big image key", - restartNeeded: true, - onChange: setRpc, + description: "Big image key/link", + onChange: onChange, isValid: isImageKeyValid }, imageBigTooltip: { type: OptionType.STRING, description: "Big image tooltip", - restartNeeded: true, - onChange: setRpc, + onChange: onChange, isValid: (value: string) => { if (value && value.length > 128) return "Big image tooltip must be not longer than 128 characters."; return true; @@ -228,16 +217,14 @@ const settings = definePluginSettings({ }, imageSmall: { type: OptionType.STRING, - description: "Small image key", - restartNeeded: true, - onChange: setRpc, + description: "Small image key/link", + onChange: onChange, isValid: isImageKeyValid }, imageSmallTooltip: { type: OptionType.STRING, description: "Small image tooltip", - restartNeeded: true, - onChange: setRpc, + onChange: onChange, isValid: (value: string) => { if (value && value.length > 128) return "Small image tooltip must be not longer than 128 characters."; return true; @@ -246,8 +233,7 @@ const settings = definePluginSettings({ buttonOneText: { type: OptionType.STRING, description: "Button 1 text", - restartNeeded: true, - onChange: setRpc, + onChange: onChange, isValid: (value: string) => { if (value && value.length > 31) return "Button 1 text must be not longer than 31 characters."; return true; @@ -256,14 +242,12 @@ const settings = definePluginSettings({ buttonOneURL: { type: OptionType.STRING, description: "Button 1 URL", - restartNeeded: true, - onChange: setRpc + onChange: onChange }, buttonTwoText: { type: OptionType.STRING, description: "Button 2 text", - restartNeeded: true, - onChange: setRpc, + onChange: onChange, isValid: (value: string) => { if (value && value.length > 31) return "Button 2 text must be not longer than 31 characters."; return true; @@ -272,26 +256,29 @@ const settings = definePluginSettings({ buttonTwoURL: { type: OptionType.STRING, description: "Button 2 URL", - restartNeeded: true, - onChange: setRpc + onChange: onChange } }); -function isStreamLinkDisabled(): boolean { +function onChange() { + setRpc(true); + if (Settings.plugins.CustomRPC.enabled) setRpc(); +} + +function isStreamLinkDisabled() { return settings.store.type !== ActivityType.STREAMING; } -function isStreamLinkValid(): boolean | string { - if (settings.store.type === ActivityType.STREAMING && settings.store.streamLink && !/(https?:\/\/(www\.)?(twitch\.tv|youtube\.com)\/\w+)/.test(settings.store.streamLink)) return "Streaming link must be a valid URL."; +function isStreamLinkValid(value: string) { + if (!isStreamLinkDisabled() && !/https?:\/\/(www\.)?(twitch\.tv|youtube\.com)\/\w+/.test(value)) return "Streaming link must be a valid URL."; return true; } -function isTimestampDisabled(): boolean { +function isTimestampDisabled() { return settings.store.timestampMode !== TimestampMode.CUSTOM; } function isImageKeyValid(value: string) { - if (!/https?:\/\//.test(value)) return true; if (/https?:\/\/(?!i\.)?imgur\.com\//.test(value)) return "Imgur link must be a direct link to the image. (e.g. https://i.imgur.com/...)"; if (/https?:\/\/(?!media\.)?tenor\.com\//.test(value)) return "Tenor link must be a direct link to the image. (e.g. https://media.tenor.com/...)"; return true; @@ -342,13 +329,10 @@ async function createActivity(): Promise { }; break; case TimestampMode.CUSTOM: - if (startTime) { - activity.timestamps = { - start: startTime, - }; - if (endTime) { - activity.timestamps.end = endTime; - } + if (startTime || endTime) { + activity.timestamps = {}; + if (startTime) activity.timestamps.start = startTime; + if (endTime) activity.timestamps.end = endTime; } break; case TimestampMode.NONE: