@@ -51,25 +51,50 @@ export default async function createDynamicEntryPoint({
5151 'window.snaps = {};' ,
5252 ] ;
5353 if ( type === 'react' ) {
54- const pathToReactDom = require . resolve ( 'react-dom' ) ;
5554 const pathToRW = renderWrapperModule || require . resolve ( './renderWrapperReact' ) ;
5655 strings . push (
5756 `let renderWrapper = require('${ pathToRW } ');` ,
5857 'renderWrapper = renderWrapper.default || renderWrapper;' ,
5958 ) ;
60- strings . push (
61- `
62- const ReactDOM = require('${ pathToReactDom } ');
63- window.happoRender = (reactComponent, { rootElement, component, variant }) =>
64- ReactDOM.render(renderWrapper(reactComponent, { component, variant }), rootElement);
6559
66- window.happoCleanup = () => {
67- for (const element of document.body.children) {
68- ReactDOM.unmountComponentAtNode(element);
69- }
70- };
71- ` . trim ( ) ,
72- ) ;
60+ const reactDomVersion = require ( 'react-dom/package.json' ) . version ;
61+ const reactDomMajorVersion = parseInt ( reactDomVersion . split ( '.' , 1 ) [ 0 ] , 10 ) ;
62+ if ( reactDomMajorVersion >= 18 ) {
63+ const pathToReactDom = require . resolve ( 'react-dom/client' ) ;
64+ strings . push (
65+ `
66+ const ReactDOM = require('${ pathToReactDom } ');
67+ let root;
68+ window.happoRender = (reactComponent, { rootElement, component, variant }) => {
69+ root = ReactDOM.createRoot(rootElement);
70+ root.render(renderWrapper(reactComponent, { component, variant }));
71+ };
72+
73+ window.happoCleanup = () => {
74+ if (root) {
75+ root.unmount();
76+ }
77+ };
78+ ` . trim ( ) ,
79+ ) ;
80+ } else {
81+ // Older versions of React DOM
82+ const pathToReactDom = require . resolve ( 'react-dom' ) ;
83+ strings . push (
84+ `
85+ const ReactDOM = require('${ pathToReactDom } ');
86+ window.happoRender = (reactComponent, { rootElement, component, variant }) => {
87+ ReactDOM.render(renderWrapper(reactComponent, { component, variant }), rootElement);
88+ };
89+
90+ window.happoCleanup = () => {
91+ for (const element of document.body.children) {
92+ ReactDOM.unmountComponentAtNode(element);
93+ }
94+ };
95+ ` . trim ( ) ,
96+ ) ;
97+ }
7398 } else {
7499 const pathToRW = renderWrapperModule || require . resolve ( './renderWrapper' ) ;
75100 strings . push (
0 commit comments