Skip to content

Commit 2b9e45a

Browse files
committed
"react": ">= 18"
1 parent eba5b39 commit 2b9e45a

File tree

4 files changed

+15
-77
lines changed

4 files changed

+15
-77
lines changed

node_package/src/clientStartup.ts

Lines changed: 8 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import type { Context } from './context';
1212
import createReactOutput from './createReactOutput';
1313
import { isServerRenderHash } from './isServerRenderResult';
1414
import reactHydrateOrRender from './reactHydrateOrRender';
15-
import { supportsRootApi } from './reactApis';
1615

1716
/* eslint-disable @typescript-eslint/no-explicit-any */
1817

@@ -168,9 +167,7 @@ You returned a server side type of react-router error: ${JSON.stringify(reactEle
168167
You should return a React.Component always for the client side entry point.`);
169168
} else {
170169
const rootOrElement = reactHydrateOrRender(domNode, reactElementOrRouterResult as ReactElement, shouldHydrate);
171-
if (supportsRootApi) {
172-
context.roots.push(rootOrElement as Root);
173-
}
170+
context.roots.push(rootOrElement as Root);
174171
}
175172
}
176173
} catch (e: any) {
@@ -211,9 +208,7 @@ export function reactOnRailsPageLoaded(): void {
211208
if (!railsContext) return;
212209

213210
const context = findContext();
214-
if (supportsRootApi) {
215-
context.roots = [];
216-
}
211+
context.roots = [];
217212
forEachStore(context, railsContext);
218213
forEachReactOnRailsComponentRender(context, railsContext);
219214
}
@@ -227,46 +222,23 @@ export function reactOnRailsComponentLoaded(domId: string): void {
227222
if (!railsContext) return;
228223

229224
const context = findContext();
230-
if (supportsRootApi) {
231-
context.roots = [];
232-
}
225+
context.roots = [];
233226

234227
const el = document.querySelector(`[data-dom-id=${domId}]`);
235228
if (!el) return;
236229

237230
render(el, context, railsContext);
238231
}
239232

240-
function unmount(el: Element): void {
241-
const domNodeId = domNodeIdForEl(el);
242-
const domNode = document.getElementById(domNodeId);
243-
if (domNode === null) {
244-
return;
245-
}
246-
try {
247-
ReactDOM.unmountComponentAtNode(domNode);
248-
} catch (e: any) {
249-
console.info(`Caught error calling unmountComponentAtNode: ${e.message} for domNode`,
250-
domNode, e);
251-
}
252-
}
253-
254233
function reactOnRailsPageUnloaded(): void {
255234
debugTurbolinks('reactOnRailsPageUnloaded');
256-
if (supportsRootApi) {
257-
const { roots } = findContext();
235+
const { roots } = findContext();
258236

259-
// If no react on rails components
260-
if (!roots) return;
237+
// If no react on rails components
238+
if (!roots) return;
261239

262-
for (const root of roots) {
263-
root.unmount();
264-
}
265-
} else {
266-
const els = reactOnRailsHtmlElements();
267-
for (let i = 0; i < els.length; i += 1) {
268-
unmount(els[i]);
269-
}
240+
for (const root of roots) {
241+
root.unmount();
270242
}
271243
}
272244

node_package/src/reactApis.ts

Lines changed: 0 additions & 8 deletions
This file was deleted.

node_package/src/reactHydrateOrRender.ts

Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,15 @@
11
import type { ReactElement } from 'react';
2-
import ReactDOM from 'react-dom';
2+
import ReactDomClient from 'react-dom/client';
33
import type { RenderReturnType } from './types';
4-
import { supportsRootApi } from './reactApis';
54

65
type HydrateOrRenderType = (domNode: Element, reactElement: ReactElement) => RenderReturnType;
76

8-
// TODO: once React dependency is updated to >= 18, we can remove this and just
9-
// import ReactDOM from 'react-dom/client';
10-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
11-
let reactDomClient: any;
12-
if (supportsRootApi) {
13-
// This will never throw an exception, but it's the way to tell Webpack the dependency is optional
14-
// https://github.com/webpack/webpack/issues/339#issuecomment-47739112
15-
// Unfortunately, it only converts the error to a warning.
16-
try {
17-
// eslint-disable-next-line global-require,import/no-unresolved
18-
reactDomClient = require('react-dom/client');
19-
} catch (e) {
20-
// We should never get here, but if we do, we'll just use the default ReactDOM
21-
// and live with the warning.
22-
reactDomClient = ReactDOM;
23-
}
24-
}
25-
26-
const reactHydrate: HydrateOrRenderType = supportsRootApi ?
27-
reactDomClient.hydrateRoot :
28-
(domNode, reactElement) => ReactDOM.hydrate(reactElement, domNode);
7+
const reactHydrate: HydrateOrRenderType = ReactDomClient.hydrateRoot;
298

309
function reactRender(domNode: Element, reactElement: ReactElement): RenderReturnType {
31-
if (supportsRootApi) {
32-
const root = reactDomClient.createRoot(domNode);
33-
root.render(reactElement);
34-
return root;
35-
}
36-
37-
// eslint-disable-next-line react/no-render-return-value
38-
return ReactDOM.render(reactElement, domNode);
10+
const root = ReactDomClient.createRoot(domNode);
11+
root.render(reactElement);
12+
return root;
3913
}
4014

4115
export default function reactHydrateOrRender(domNode: Element, reactElement: ReactElement, hydrate: boolean): RenderReturnType {

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@
4646
"dependencies": {
4747
},
4848
"peerDependencies": {
49-
"react": ">= 16",
50-
"react-dom": ">= 16"
49+
"react": ">= 18",
50+
"react-dom": ">= 18"
5151
},
5252
"files": [
5353
"node_package/lib"

0 commit comments

Comments
 (0)