zoid
Version:
Cross domain components.
99 lines (68 loc) • 2.78 kB
JavaScript
/* @flow */
import { extend } from 'belter/src';
import type { Component, ComponentDriverType } from '../component/component';
import { CONTEXT } from '../constants';
declare class ReactClassType {
}
type ReactElementType = {
};
type ReactType = {
createClass : ({ render : ReactElementType, componentDidMount : () => void, componentDidUpdate : () => void }) => (typeof ReactClassType),
createElement : (string, ?{ [string] : mixed }, ...children : Array<ReactElementType>) => ReactElementType
};
type ReactDomType = {
findDOMNode : (ReactElementType) => HTMLElement
};
type ReactLibraryType = { React : ReactType, ReactDOM : ReactDomType };
export let react : ComponentDriverType<*, ReactLibraryType> = {
global() : ?ReactLibraryType {
if (window.React && window.ReactDOM) {
return {
React: window.React,
ReactDOM: window.ReactDOM
};
}
},
register(component : Component<*>, { React, ReactDOM } : ReactLibraryType) : (typeof ReactClassType) {
if (React.createClass) {
// $FlowFixMe
component.react = React.createClass({
render() : ReactElementType {
return React.createElement('div', null);
},
componentDidMount() {
component.log(`instantiate_react_component`);
let el = ReactDOM.findDOMNode(this);
let parent = component.init(extend({}, this.props), null, el);
this.setState({ parent });
parent.render(CONTEXT.IFRAME, el);
},
componentDidUpdate() {
if (this.state && this.state.parent) {
this.state.parent.updateProps(extend({}, this.props));
}
}
});
} else {
// $FlowFixMe
component.react = class extends React.Component {
render() : ReactElementType {
return React.createElement('div', null);
}
componentDidMount() {
component.log(`instantiate_react_component`);
let el = ReactDOM.findDOMNode(this);
let parent = component.init(extend({}, this.props), null, el);
this.setState({ parent });
parent.render(CONTEXT.IFRAME, el);
}
componentDidUpdate() {
if (this.state && this.state.parent) {
this.state.parent.updateProps(extend({}, this.props));
}
}
};
}
return component.react;
}
};