From 89ef26e719ce3d257737b58e4f5e50052474ed74 Mon Sep 17 00:00:00 2001
From: Nuckyz <61953774+Nuckyz@users.noreply.github.com>
Date: Mon, 5 May 2025 19:39:34 -0300
Subject: [PATCH] Fix ImageZoom, Vencord Notifications & ReactErrorDecoder
---
src/api/Notifications/Notifications.tsx | 4 ++--
src/plugins/consoleShortcuts/index.ts | 2 +-
src/plugins/imageZoom/index.tsx | 4 ++--
src/plugins/reactErrorDecoder/index.ts | 15 +++++++--------
src/webpack/common/react.ts | 6 ++++--
5 files changed, 16 insertions(+), 15 deletions(-)
diff --git a/src/api/Notifications/Notifications.tsx b/src/api/Notifications/Notifications.tsx
index 1350e5bdc..96a3425b5 100644
--- a/src/api/Notifications/Notifications.tsx
+++ b/src/api/Notifications/Notifications.tsx
@@ -18,7 +18,7 @@
import { Settings } from "@api/Settings";
import { Queue } from "@utils/Queue";
-import { ReactDOM } from "@webpack/common";
+import { createRoot } from "@webpack/common";
import type { ReactNode } from "react";
import type { Root } from "react-dom/client";
@@ -35,7 +35,7 @@ function getRoot() {
const container = document.createElement("div");
container.id = "vc-notification-container";
document.body.append(container);
- reactRoot = ReactDOM.createRoot(container);
+ reactRoot = createRoot(container);
}
return reactRoot;
}
diff --git a/src/plugins/consoleShortcuts/index.ts b/src/plugins/consoleShortcuts/index.ts
index 49e671581..e8150f8fb 100644
--- a/src/plugins/consoleShortcuts/index.ts
+++ b/src/plugins/consoleShortcuts/index.ts
@@ -136,7 +136,7 @@ function makeShortcuts() {
});
}
- const root = Common.ReactDOM.createRoot(doc.body.appendChild(document.createElement("div")));
+ const root = Common.createRoot(doc.body.appendChild(document.createElement("div")));
root.render(Common.React.createElement(component, props));
doc.addEventListener("close", () => root.unmount(), { once: true });
diff --git a/src/plugins/imageZoom/index.tsx b/src/plugins/imageZoom/index.tsx
index d7e8d487b..56e1d4a20 100644
--- a/src/plugins/imageZoom/index.tsx
+++ b/src/plugins/imageZoom/index.tsx
@@ -23,7 +23,7 @@ import { debounce } from "@shared/debounce";
import { Devs } from "@utils/constants";
import { Logger } from "@utils/Logger";
import definePlugin, { OptionType } from "@utils/types";
-import { Menu, ReactDOM } from "@webpack/common";
+import { createRoot, Menu } from "@webpack/common";
import { JSX } from "react";
import type { Root } from "react-dom/client";
@@ -242,7 +242,7 @@ export default definePlugin({
if (instance.props.id === ELEMENT_ID) {
if (!this.currentMagnifierElement) {
this.currentMagnifierElement = ;
- this.root = ReactDOM.createRoot(this.element!);
+ this.root = createRoot(this.element!);
this.root.render(this.currentMagnifierElement);
}
}
diff --git a/src/plugins/reactErrorDecoder/index.ts b/src/plugins/reactErrorDecoder/index.ts
index 9e2e5dc50..45ab297a6 100644
--- a/src/plugins/reactErrorDecoder/index.ts
+++ b/src/plugins/reactErrorDecoder/index.ts
@@ -20,7 +20,7 @@ import { Devs } from "@utils/constants";
import definePlugin from "@utils/types";
import { React } from "@webpack/common";
-let ERROR_CODES: any;
+let ERROR_CODES: Record | undefined;
export default definePlugin({
name: "ReactErrorDecoder",
@@ -28,13 +28,12 @@ export default definePlugin({
authors: [Devs.Cyn, Devs.maisymoe],
patches: [
{
- find: '"https://reactjs.org/docs/error-decoder.html?invariant="',
+ find: "React has blocked a javascript: URL as a security precaution.",
replacement: {
- match: /(function .\(.\)){(for\(var .="https:\/\/reactjs\.org\/docs\/error-decoder\.html\?invariant="\+.,.=1;.
- `${func}{var decoded=$self.decodeError.apply(null, arguments);if(decoded)return decoded;${original}}`,
- },
- },
+ match: /"https:\/\/react.dev\/errors\/"\+\i;/,
+ replace: "$&const vcDecodedError=$self.decodeError(...arguments);if(vcDecodedError)return vcDecodedError;"
+ }
+ }
],
async start() {
@@ -56,5 +55,5 @@ export default definePlugin({
index++;
return arg;
});
- },
+ }
});
diff --git a/src/webpack/common/react.ts b/src/webpack/common/react.ts
index aa279d652..89b19506e 100644
--- a/src/webpack/common/react.ts
+++ b/src/webpack/common/react.ts
@@ -17,7 +17,7 @@
*/
// eslint-disable-next-line path-alias/no-relative
-import { findByPropsLazy, waitFor } from "../webpack";
+import { findByCodeLazy, findByPropsLazy, waitFor } from "../webpack";
export let React: typeof import("react");
export let useState: typeof React.useState;
@@ -28,7 +28,9 @@ export let useRef: typeof React.useRef;
export let useReducer: typeof React.useReducer;
export let useCallback: typeof React.useCallback;
-export const ReactDOM: typeof import("react-dom") & typeof import("react-dom/client") = findByPropsLazy("createPortal");
+export const ReactDOM: typeof import("react-dom") = findByPropsLazy("createPortal");
+// 299 is an error code used in createRoot and createPortal
+export const createRoot: typeof import("react-dom/client").createRoot = findByCodeLazy("(299));", ".onRecoverableError");
waitFor("useState", m => {
React = m;