@ima/react-page-renderer
Version:
IMA.js React page renderer.
44 lines (43 loc) • 1.57 kB
JavaScript
import { RendererEvents } from '@ima/core';
import { createRoot, hydrateRoot } from 'react-dom/client';
import { AbstractClientPageRenderer } from './AbstractClientPageRenderer';
/**
* Client-side page renderer. The renderer attempts to reuse the markup sent by
* server if possible.
*/ export class ClientPageRenderer extends AbstractClientPageRenderer {
_reactRoot;
unmount() {
if (this._reactRoot) {
this._reactRoot.unmount();
this._reactRoot = undefined;
this._runUnmountCallback();
}
super.unmount();
}
_hydrateViewAdapter() {
const serverNode = this._viewContainer?.cloneNode(true);
this._reactRoot = hydrateRoot(this._viewContainer, this._getViewAdapterElement({
refCallback: this._getHydrateCallback()
}), {
onRecoverableError: (error)=>{
if ($Debug) {
console.error('onRecoverableError', error);
}
this._dispatcher.fire(RendererEvents.HYDRATE_ERROR, {
error,
serverNode,
clientNode: this._viewContainer?.cloneNode(true)
});
}
});
}
_renderViewAdapter(callback, props) {
if (!this._reactRoot) {
this._reactRoot = createRoot(this._viewContainer);
}
this._reactRoot.render(this._getViewAdapterElement(Object.assign({}, props, {
refCallback: callback
})));
}
}
//# sourceMappingURL=ClientPageRenderer.js.map