Completely updated React, fixed #11, (hopefully)

This commit is contained in:
2018-03-04 19:11:49 -05:00
parent 6e0afd6e2a
commit 34e5f5139a
13674 changed files with 333464 additions and 473223 deletions

View File

@@ -0,0 +1,97 @@
import React from 'react';
import ReactDOM from 'react-dom';
import PropTypes from 'prop-types';
import ownerDocument from 'dom-helpers/ownerDocument';
import exactProp from '../utils/exactProp';
function getContainer(container, defaultContainer) {
container = typeof container === 'function' ? container() : container;
return ReactDOM.findDOMNode(container) || defaultContainer;
}
function getOwnerDocument(element) {
return ownerDocument(ReactDOM.findDOMNode(element));
}
/**
* @ignore - internal component.
*
* This module will soon be gone. We should drop it as soon as React@15.x support stop.
*/
class LegacyPortal extends React.Component {
constructor(...args) {
var _temp;
return _temp = super(...args), this.getMountNode = () => {
return this.mountNode;
}, this.mountOverlayTarget = () => {
if (!this.overlayTarget) {
this.overlayTarget = document.createElement('div');
this.mountNode = getContainer(this.props.container, getOwnerDocument(this).body);
this.mountNode.appendChild(this.overlayTarget);
}
}, this.unmountOverlayTarget = () => {
if (this.overlayTarget) {
this.mountNode.removeChild(this.overlayTarget);
this.overlayTarget = null;
}
this.mountNode = null;
}, this.unrenderOverlay = () => {
if (this.overlayTarget) {
ReactDOM.unmountComponentAtNode(this.overlayTarget);
this.overlayInstance = null;
}
}, this.renderOverlay = () => {
const overlay = this.props.children;
this.mountOverlayTarget();
const initialRender = !this.overlayInstance;
this.overlayInstance = ReactDOM.unstable_renderSubtreeIntoContainer(this, overlay, this.overlayTarget, () => {
if (initialRender && this.props.onRendered) {
this.props.onRendered();
}
});
}, _temp;
}
componentDidMount() {
this.mounted = true;
this.renderOverlay();
}
componentWillReceiveProps(nextProps) {
if (this.overlayTarget && nextProps.container !== this.props.container) {
this.mountNode.removeChild(this.overlayTarget);
this.mountNode = getContainer(nextProps.container, getOwnerDocument(this).body);
this.mountNode.appendChild(this.overlayTarget);
}
}
componentDidUpdate() {
this.renderOverlay();
}
componentWillUnmount() {
this.mounted = false;
this.unrenderOverlay();
this.unmountOverlayTarget();
}
/**
* @public
*/
render() {
return null;
}
}
LegacyPortal.propTypes = process.env.NODE_ENV !== "production" ? {
children: PropTypes.element.isRequired,
container: PropTypes.oneOfType([PropTypes.object, PropTypes.func]),
onRendered: PropTypes.func
} : {};
LegacyPortal.propTypes = process.env.NODE_ENV !== "production" ? exactProp(LegacyPortal.propTypes, 'LegacyPortal') : {};
export default LegacyPortal;

View File

@@ -0,0 +1,9 @@
import * as React from 'react';
export interface PortalProps {
children: React.ReactElement<any>;
container?: React.ReactInstance | (() => React.ReactInstance);
onRendered?: () => void;
}
export default class Portal extends React.Component<PortalProps> {}

View File

@@ -0,0 +1,82 @@
import React from 'react';
import ReactDOM from 'react-dom';
import PropTypes from 'prop-types';
import ownerDocument from 'dom-helpers/ownerDocument';
import exactProp from '../utils/exactProp';
function getContainer(container, defaultContainer) {
container = typeof container === 'function' ? container() : container;
return ReactDOM.findDOMNode(container) || defaultContainer;
}
function getOwnerDocument(element) {
return ownerDocument(ReactDOM.findDOMNode(element));
}
/**
* This component shares many concepts with
* [react-overlays](https://react-bootstrap.github.io/react-overlays/#portals)
* But has been forked in order to fix some bugs, reduce the number of dependencies
* and take the control of our destiny.
*/
class Portal extends React.Component {
constructor(...args) {
var _temp;
return _temp = super(...args), this.getMountNode = () => {
return this.mountNode;
}, _temp;
}
componentDidMount() {
this.setContainer(this.props.container);
this.forceUpdate(this.props.onRendered);
}
componentWillReceiveProps(nextProps) {
if (nextProps.container !== this.props.container) {
this.setContainer(nextProps.container);
}
}
componentWillUnmount() {
this.mountNode = null;
}
setContainer(container) {
this.mountNode = getContainer(container, getOwnerDocument(this).body);
}
/**
* @public
*/
render() {
const { children } = this.props;
return this.mountNode ? ReactDOM.createPortal(children, this.mountNode) : null;
}
}
Portal.propTypes = process.env.NODE_ENV !== "production" ? {
/**
* The children to render into the `container`.
*/
children: PropTypes.node.isRequired,
/**
* A node, component instance, or function that returns either.
* The `container` will have the portal children appended to it.
* By default, it's using the body of the top-level document object,
* so it's simply `document.body` most of the time.
*/
container: PropTypes.oneOfType([PropTypes.object, PropTypes.func]),
/**
* Callback fired once the children has been mounted into the `container`.
*/
onRendered: PropTypes.func
} : {};
Portal.propTypes = process.env.NODE_ENV !== "production" ? exactProp(Portal.propTypes, 'Portal') : {};
export default Portal;

View File

@@ -0,0 +1,2 @@
export { default } from './Portal';
export * from './Portal';

View File

@@ -0,0 +1,5 @@
import ReactDOM from 'react-dom';
import Portal from './Portal';
import LegacyPortal from './LegacyPortal';
export default ReactDOM.createPortal ? Portal : LegacyPortal;