react-on-rails
Version:
react-on-rails JavaScript for react_on_rails Ruby gem
39 lines (38 loc) • 1.64 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = reactHydrateOrRender;
const ReactDOM = require("react-dom");
const reactApis_1 = require("./reactApis");
// TODO: once React dependency is updated to >= 18, we can remove this and just
// import ReactDOM from 'react-dom/client';
// eslint-disable-next-line @typescript-eslint/no-explicit-any
let reactDomClient;
if (reactApis_1.supportsRootApi) {
// This will never throw an exception, but it's the way to tell Webpack the dependency is optional
// https://github.com/webpack/webpack/issues/339#issuecomment-47739112
// Unfortunately, it only converts the error to a warning.
try {
// eslint-disable-next-line global-require,import/no-unresolved
reactDomClient = require('react-dom/client');
}
catch (e) {
// We should never get here, but if we do, we'll just use the default ReactDOM
// and live with the warning.
reactDomClient = ReactDOM;
}
}
const reactHydrate = reactApis_1.supportsRootApi ?
reactDomClient.hydrateRoot :
(domNode, reactElement) => ReactDOM.hydrate(reactElement, domNode);
function reactRender(domNode, reactElement) {
if (reactApis_1.supportsRootApi) {
const root = reactDomClient.createRoot(domNode);
root.render(reactElement);
return root;
}
// eslint-disable-next-line react/no-render-return-value
return ReactDOM.render(reactElement, domNode);
}
function reactHydrateOrRender(domNode, reactElement, hydrate) {
return hydrate ? reactHydrate(domNode, reactElement) : reactRender(domNode, reactElement);
}