react-oc
Version:
A React component that allows OpenComponents to operate within a react application.
59 lines (53 loc) • 1.73 kB
JavaScript
import React from 'react';
import ReactDOM from 'react-dom';
/**
* based on: https://github.com/facebook/react/issues/11098#issuecomment-412682721
* wraps the render method to suppress the error message from reaching the console
* during the rendering process.
*
* waiting for componentDidMount allows us to ensure we capture errors within
* componentDidMount handlers.
*/
function reactRenderAsync(reactRenderFn, component, node) {
const ctx = {};
let unpause;
const wait = new Promise((resolve) => { unpause = resolve; });
class Wrapper extends React.Component {
constructor(props) {
super(props);
this.state = {};
}
componentDidCatch(err) {
this.setState({errored: true})
ctx.err = err;
}
render() {
return this.state.errored ? null : this.props.children;
}
componentDidMount() {
unpause();
}
}
const preventErrorLogs = (event) => {
event.preventDefault();
window.removeEventListener('error', this);
};
window.addEventListener('error', preventErrorLogs.bind(preventErrorLogs));
return new Promise((resolve, reject) => {
reactRenderFn(<Wrapper>{component}</Wrapper>, node, () => {
wait.then(() => {
if (ctx.err){
reject(ctx.err);
} else {
resolve();
}
})
});
});
}
export const renderAsync = (component, node) => {
return reactRenderAsync(ReactDOM.render, component, node);
}
export const hydrateAsync = (component, node) => {
return reactRenderAsync(ReactDOM.hydrate, component, node);
}