diff --git a/src/components/PluginSettings/index.tsx b/src/components/PluginSettings/index.tsx index f3a5cd3..5a367c8 100644 --- a/src/components/PluginSettings/index.tsx +++ b/src/components/PluginSettings/index.tsx @@ -33,6 +33,7 @@ import Logger from "@utils/Logger"; import { Margins } from "@utils/margins"; import { classes, LazyComponent, useAwaiter } from "@utils/misc"; import { openModalLazy } from "@utils/modal"; +import { onlyOnce } from "@utils/onlyOnce"; import { Plugin } from "@utils/types"; import { findByCode, findByPropsLazy } from "@webpack"; import { Alerts, Button, Card, Forms, Parser, React, Select, Text, TextInput, Toasts, Tooltip } from "@webpack/common"; @@ -341,7 +342,7 @@ export default ErrorBoundary.wrap(function PluginSettings() { ); }, { message: "Failed to render the Plugin Settings. If this persists, try using the installer to reinstall!", - onError: handleComponentFailed, + onError: onlyOnce(handleComponentFailed), }); function makeDependencyList(deps: string[]) { diff --git a/src/components/VencordSettings/Updater.tsx b/src/components/VencordSettings/Updater.tsx index fb78394..6fec9e7 100644 --- a/src/components/VencordSettings/Updater.tsx +++ b/src/components/VencordSettings/Updater.tsx @@ -25,6 +25,7 @@ import { Link } from "@components/Link"; import { Margins } from "@utils/margins"; import { classes, useAwaiter } from "@utils/misc"; import { relaunch } from "@utils/native"; +import { onlyOnce } from "@utils/onlyOnce"; import { changes, checkForUpdates, getRepo, isNewer, update, updateError, UpdateLogger } from "@utils/updater"; import { Alerts, Button, Card, Forms, Parser, React, Switch, Toasts } from "@webpack/common"; @@ -250,5 +251,5 @@ function Updater() { export default IS_WEB ? null : ErrorBoundary.wrap(Updater, { message: "Failed to render the Updater. If this persists, try using the installer to reinstall!", - onError: handleComponentFailed, + onError: onlyOnce(handleComponentFailed), }); diff --git a/src/components/VencordSettings/index.tsx b/src/components/VencordSettings/index.tsx index b2916c4..6d65aa1 100644 --- a/src/components/VencordSettings/index.tsx +++ b/src/components/VencordSettings/index.tsx @@ -22,6 +22,7 @@ import { classNameFactory } from "@api/Styles"; import ErrorBoundary from "@components/ErrorBoundary"; import { handleComponentFailed } from "@components/handleComponentFailed"; import { isMobile } from "@utils/misc"; +import { onlyOnce } from "@utils/onlyOnce"; import { Forms, SettingsRouter, TabBar, Text } from "@webpack/common"; import BackupRestoreTab from "./BackupRestoreTab"; @@ -86,8 +87,10 @@ function Settings(props: SettingsProps) { ; } +const onError = onlyOnce(handleComponentFailed); + export default function (props: SettingsProps) { - return + return ; } diff --git a/src/utils/index.ts b/src/utils/index.ts index 98e923f..6723a70 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -25,7 +25,7 @@ export * from "./margins"; export * from "./misc"; export * as Modals from "./modal"; export * from "./onceDefined"; +export * from "./onlyOnce"; export * from "./proxyLazy"; export * from "./Queue"; export * from "./text"; - diff --git a/src/utils/onlyOnce.ts b/src/utils/onlyOnce.ts new file mode 100644 index 0000000..f5cb8c9 --- /dev/null +++ b/src/utils/onlyOnce.ts @@ -0,0 +1,29 @@ +/* + * 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 onlyOnce(f: F): F { + let called = false; + let result: any; + return function onlyOnceWrapper(this: unknown) { + if (called) return result; + + called = true; + + return (result = f.apply(this, arguments)); + } as unknown as F; +}