main
js 58 lines 1.28 KB
Raw
1 const React = window.React;
2 const ReactDOM = window.ReactDOM;
3
4 class IframePortal extends React.Component {
5 iframeRef = null;
6
7 handleRef = ref => {
8 if (ref !== this.iframeRef) {
9 this.iframeRef = ref;
10 if (ref) {
11 if (ref.contentDocument && this.props.head) {
12 ref.contentDocument.head.innerHTML = this.props.head;
13 }
14 // Re-render must take place in the next tick (Firefox)
15 setTimeout(() => {
16 this.forceUpdate();
17 });
18 }
19 }
20 };
21
22 render() {
23 const ref = this.iframeRef;
24 let portal = null;
25 if (ref && ref.contentDocument) {
26 portal = ReactDOM.createPortal(
27 this.props.children,
28 ref.contentDocument.body
29 );
30 }
31
32 return (
33 <div>
34 <iframe
35 title="Iframe portal"
36 style={{border: 'none', height: this.props.height}}
37 ref={this.handleRef}
38 />
39 {portal}
40 </div>
41 );
42 }
43 }
44
45 class IframeSubtree extends React.Component {
46 warned = false;
47 render() {
48 if (!this.warned) {
49 console.error(
50 `IFrame has not yet been implemented for React v${React.version}`
51 );
52 this.warned = true;
53 }
54 return <div>{this.props.children}</div>;
55 }
56 }
57
58 export default ReactDOM.createPortal ? IframePortal : IframeSubtree;