Skip to content

Commit

Permalink
Fix: awaiting potential react-dom promise
Browse files Browse the repository at this point in the history
  • Loading branch information
stevematney committed Jan 10, 2023
1 parent 2376cae commit 18421b6
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 14 deletions.
10 changes: 5 additions & 5 deletions src/ReactHTMLElement.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type ReactDOM from 'react-dom';
import type { Root } from 'react-dom/client';
import { createRoot } from './react-dom-client';
import { getCreateRoot } from './react-dom-client';

type Renderable = Parameters<ReactDOM.Renderer>[0][number];
type ReactHTMLElementDOMRoot = Pick<Root, 'render' | 'unmount'>;
Expand Down Expand Up @@ -42,10 +42,10 @@ class ReactHTMLElement extends HTMLElement {
this._mountPoint = mount;
}

root(): ReactHTMLElementDOMRoot {
async root(): Promise<ReactHTMLElementDOMRoot> {
if (this._root) return this._root;

this._root = createRoot(this.mountPoint);
this._root = (await getCreateRoot())(this.mountPoint);
return this._root;
}

Expand All @@ -55,8 +55,8 @@ class ReactHTMLElement extends HTMLElement {
void this.renderRoot(app);
}

renderRoot(app: Renderable): void {
const root = this.root();
async renderRoot(app: Renderable): Promise<void> {
const root = await this.root();
root.render(app);
}

Expand Down
24 changes: 15 additions & 9 deletions src/react-dom-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,6 @@ type ReactDOM18 = ReactDOMOriginal & {
createRoot?: CreateRoot;
};

let MaybeReactDOM18: ReactDOM18;
try {
// eslint-disable-next-line global-require,@typescript-eslint/no-var-requires
MaybeReactDOM18 = require('react-dom/client') as ReactDOM18;
} catch {
MaybeReactDOM18 = ReactDOM as ReactDOM18;
}

type CreateRoot = typeof createRootOriginal;
type CreateRootParams = Parameters<CreateRoot>;
type ReactDOMOriginal = typeof ReactDOM;
Expand All @@ -30,5 +22,19 @@ const createRootFake = (container: CreateRootParams[0]) => {
return newRoot;
};

let checkedFor18 = false;
let MaybeReactDOM18: ReactDOM18;
// eslint-disable-next-line import/prefer-default-export
export const { createRoot = createRootFake } = MaybeReactDOM18;
export const getCreateRoot = async () => {
if (!checkedFor18) {
try {
// eslint-disable-next-line global-require,@typescript-eslint/no-var-requires
MaybeReactDOM18 = (await require('react-dom/client')) as ReactDOM18;
} catch {
MaybeReactDOM18 = ReactDOM as ReactDOM18;
}
checkedFor18 = true;
}
const { createRoot = createRootFake } = MaybeReactDOM18;
return createRoot;
};

0 comments on commit 18421b6

Please sign in to comment.