function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } import ReactDOM from 'react-dom'; function defaultGetContainer() { var container = document.createElement('div'); document.body.appendChild(container); return container; } export default function getContainerRenderMixin(config) { var _config$autoMount = config.autoMount, autoMount = _config$autoMount === void 0 ? true : _config$autoMount, _config$autoDestroy = config.autoDestroy, autoDestroy = _config$autoDestroy === void 0 ? true : _config$autoDestroy, isVisible = config.isVisible, isForceRender = config.isForceRender, getComponent = config.getComponent, _config$getContainer = config.getContainer, getContainer = _config$getContainer === void 0 ? defaultGetContainer : _config$getContainer; var mixin; function _renderComponent(instance, componentArg, ready) { if (!isVisible || instance._component || isVisible(instance) || isForceRender && isForceRender(instance)) { if (!instance._container) { instance._container = getContainer(instance); } var component; if (instance.getComponent) { component = instance.getComponent(componentArg); } else { component = getComponent(instance, componentArg); } ReactDOM.unstable_renderSubtreeIntoContainer(instance, component, instance._container, function callback() { instance._component = this; if (ready) { ready.call(this); } }); } } if (autoMount) { mixin = _objectSpread(_objectSpread({}, mixin), {}, { componentDidMount: function componentDidMount() { _renderComponent(this); }, componentDidUpdate: function componentDidUpdate() { _renderComponent(this); } }); } if (!autoMount || !autoDestroy) { mixin = _objectSpread(_objectSpread({}, mixin), {}, { renderComponent: function renderComponent(componentArg, ready) { _renderComponent(this, componentArg, ready); } }); } function _removeContainer(instance) { if (instance._container) { var container = instance._container; ReactDOM.unmountComponentAtNode(container); container.parentNode.removeChild(container); instance._container = null; } } if (autoDestroy) { mixin = _objectSpread(_objectSpread({}, mixin), {}, { componentWillUnmount: function componentWillUnmount() { _removeContainer(this); } }); } else { mixin = _objectSpread(_objectSpread({}, mixin), {}, { removeContainer: function removeContainer() { _removeContainer(this); } }); } return mixin; }