diff options
-rw-r--r-- | src/components/ErrorBoundary.tsx | 6 | ||||
-rw-r--r-- | src/components/PluginSettings/index.tsx | 4 | ||||
-rw-r--r-- | src/components/Settings.tsx | 4 | ||||
-rw-r--r-- | src/components/Updater.tsx | 6 | ||||
-rw-r--r-- | src/components/handleComponentFailed.ts | 44 |
5 files changed, 60 insertions, 4 deletions
diff --git a/src/components/ErrorBoundary.tsx b/src/components/ErrorBoundary.tsx index 4429f72..86a5946 100644 --- a/src/components/ErrorBoundary.tsx +++ b/src/components/ErrorBoundary.tsx @@ -102,11 +102,11 @@ const ErrorBoundary = LazyComponent(() => { }; }) as React.ComponentType<React.PropsWithChildren<Props>> & { - wrap<T extends JSX.IntrinsicAttributes = any>(Component: React.ComponentType<T>): React.ComponentType<T>; + wrap<T extends JSX.IntrinsicAttributes = any>(Component: React.ComponentType<T>, errorBoundaryProps?: Props): React.ComponentType<T>; }; -ErrorBoundary.wrap = Component => props => ( - <ErrorBoundary> +ErrorBoundary.wrap = (Component, errorBoundaryProps) => props => ( + <ErrorBoundary {...errorBoundaryProps}> <Component {...props} /> </ErrorBoundary> ); diff --git a/src/components/PluginSettings/index.tsx b/src/components/PluginSettings/index.tsx index 9600ef7..a0dfc24 100644 --- a/src/components/PluginSettings/index.tsx +++ b/src/components/PluginSettings/index.tsx @@ -31,6 +31,7 @@ import { Alerts, Button, Forms, Margins, Parser, React, Select, Switch, Text, Te import ErrorBoundary from "../ErrorBoundary"; import { ErrorCard } from "../ErrorCard"; import { Flex } from "../Flex"; +import { handleComponentFailed } from "../handleComponentFailed"; import PluginModal from "./PluginModal"; import * as styles from "./styles"; @@ -312,6 +313,9 @@ export default ErrorBoundary.wrap(function Settings() { </div> </Forms.FormSection > ); +}, { + message: "Failed to render the Plugin Settings. If this persists, try using the installer to reinstall!", + onError: handleComponentFailed, }); function makeDependencyList(deps: string[]) { diff --git a/src/components/Settings.tsx b/src/components/Settings.tsx index b4504a2..363b1df 100644 --- a/src/components/Settings.tsx +++ b/src/components/Settings.tsx @@ -23,6 +23,7 @@ import { useAwaiter } from "../utils/misc"; import { Alerts, Button, Forms, Margins, Parser, React, Switch } from "../webpack/common"; import ErrorBoundary from "./ErrorBoundary"; import { Flex } from "./Flex"; +import { handleComponentFailed } from "./handleComponentFailed"; export default ErrorBoundary.wrap(function Settings() { const [settingsDir, , settingsDirPending] = useAwaiter(() => VencordNative.ipc.invoke<string>(IpcEvents.GET_SETTINGS_DIR), "Loading..."); @@ -115,4 +116,7 @@ export default ErrorBoundary.wrap(function Settings() { </Switch>} </Forms.FormSection > ); +}, { + message: "Failed to render the Settings. If this persists, try using the installer to reinstall!", + onError: handleComponentFailed, }); diff --git a/src/components/Updater.tsx b/src/components/Updater.tsx index a11d65b..8abdf28 100644 --- a/src/components/Updater.tsx +++ b/src/components/Updater.tsx @@ -24,6 +24,7 @@ import { Alerts, Button, Card, Forms, Margins, Parser, React, Toasts } from "../ import ErrorBoundary from "./ErrorBoundary"; import { ErrorCard } from "./ErrorCard"; import { Flex } from "./Flex"; +import { handleComponentFailed } from "./handleComponentFailed"; import { Link } from "./Link"; function withDispatcher(dispatcher: React.Dispatch<React.SetStateAction<boolean>>, action: () => any) { @@ -209,4 +210,7 @@ function Updater() { ); } -export default IS_WEB ? null : ErrorBoundary.wrap(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, +}); diff --git a/src/components/handleComponentFailed.ts b/src/components/handleComponentFailed.ts new file mode 100644 index 0000000..34f3ab9 --- /dev/null +++ b/src/components/handleComponentFailed.ts @@ -0,0 +1,44 @@ +/* + * Vencord, a modification for Discord's desktop app + * Copyright (c) 2022 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/>. +*/ + +import { isOutdated, rebuild, update } from "../utils/updater"; + +export async function handleComponentFailed() { + if (isOutdated) { + setImmediate(async () => { + const wantsUpdate = confirm( + "Uh Oh! Failed to render this Page." + + " However, there is an update available that might fix it." + + " Would you like to update and restart now?" + ); + if (wantsUpdate) { + try { + await update(); + await rebuild(); + if (IS_WEB) + location.reload(); + else + DiscordNative.app.relaunch(); + } catch (e) { + console.error(e); + alert("That also failed :( Try updating or reinstalling with the installer!"); + } + } + }); + } +} |