diff --git a/package.json b/package.json index 7fbc17d9de6..4337b87b039 100644 --- a/package.json +++ b/package.json @@ -79,10 +79,10 @@ "prop-types": "^15.8.1", "randexp": "^0.5.3", "randombytes": "^2.1.0", - "react": "=17.0.2", + "react": "^18.2.0", "react-copy-to-clipboard": "5.1.0", "react-debounce-input": "=3.3.0", - "react-dom": "=17.0.2", + "react-dom": "^18.2.0", "react-immutable-proptypes": "2.2.0", "react-immutable-pure-component": "^2.2.0", "react-inspector": "^6.0.1", @@ -118,7 +118,7 @@ "@jest/globals": "=29.5.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.4", "@release-it/conventional-changelog": "=5.1.0", - "@wojtekmaj/enzyme-adapter-react-17": "=0.6.6", + "@wojtekmaj/enzyme-adapter-react-18": "=0.7.1", "autoprefixer": "^10.4.12", "babel-loader": "^9.1.2", "babel-plugin-lodash": "=3.3.4", @@ -169,7 +169,7 @@ "prettier": "^2.8.7", "process": "^0.11.10", "react-refresh": "^0.14.0", - "react-test-renderer": "=17.0.2", + "react-test-renderer": "^18.2.0", "release-it": "=15.4.2", "rimraf": "^4.3.1", "sass": "^1.54.0", diff --git a/src/core/plugins/view/root-injects.jsx b/src/core/plugins/view/root-injects.jsx index ce931225a66..2aefd24f142 100644 --- a/src/core/plugins/view/root-injects.jsx +++ b/src/core/plugins/view/root-injects.jsx @@ -1,5 +1,5 @@ import React, { Component } from "react" -import ReactDOM from "react-dom" +import { createRoot } from "react-dom/client" import { compose } from "redux" import { connect, Provider } from "react-redux" import omit from "lodash/omit" @@ -80,9 +80,19 @@ export const withMappedContainer = (getSystem, getStore, memGetComponent) => (co return WithMappedContainer } +// Store root instances to avoid creating multiple roots on the same DOM node +const rootInstances = new WeakMap() + export const render = (getSystem, getStore, getComponent, getComponents) => (domNode) => { const App = getComponent(getSystem, getStore, getComponents)("App", "root") - ReactDOM.render(, domNode) + + // Use React 18's createRoot API + let root = rootInstances.get(domNode) + if (!root) { + root = createRoot(domNode) + rootInstances.set(domNode, root) + } + root.render() } export const getComponent = (getSystem, getStore, getComponents) => (componentName, container, config = {}) => { diff --git a/test/mocha/setup.js b/test/mocha/setup.js index 06c650e0ba7..2277decd18b 100644 --- a/test/mocha/setup.js +++ b/test/mocha/setup.js @@ -1,6 +1,6 @@ const { JSDOM } = require("jsdom") const Enzyme = require("enzyme") -const Adapter = require("@wojtekmaj/enzyme-adapter-react-17") +const Adapter = require("@wojtekmaj/enzyme-adapter-react-18") const win = require("../../src/core/window")