"use strict"; function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } 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; } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } var React = require("react"); var PropTypes = require("prop-types"); var ALL_INITIALIZERS = []; var READY_INITIALIZERS = []; function isWebpackReady(getModuleIds) { if (typeof __webpack_modules__ !== "object") { return false; } return getModuleIds().every(function (moduleId) { return typeof moduleId !== "undefined" && typeof __webpack_modules__[moduleId] !== "undefined"; }); } function load(loader) { var promise = loader(); var state = { loading: true, loaded: null, error: null }; state.promise = promise.then(function (loaded) { state.loading = false; state.loaded = loaded; return loaded; }).catch(function (err) { state.loading = false; state.error = err; throw err; }); return state; } function loadMap(obj) { var state = { loading: false, loaded: {}, error: null }; var promises = []; try { Object.keys(obj).forEach(function (key) { var result = load(obj[key]); if (!result.loading) { state.loaded[key] = result.loaded; state.error = result.error; } else { state.loading = true; } promises.push(result.promise); result.promise.then(function (res) { state.loaded[key] = res; }).catch(function (err) { state.error = err; }); }); } catch (err) { state.error = err; } state.promise = Promise.all(promises).then(function (res) { state.loading = false; return res; }).catch(function (err) { state.loading = false; throw err; }); return state; } function resolve(obj) { return obj && obj.__esModule ? obj.default : obj; } function render(loaded, props) { return React.createElement(resolve(loaded), props); } function createLoadableComponent(loadFn, options) { var _class, _temp; if (!options.loading) { throw new Error("react-loadable requires a `loading` component"); } var opts = _extends({ loader: null, loading: null, delay: 200, timeout: null, render: render, webpack: null, modules: null }, options); var res = null; function init() { if (!res) { res = loadFn(opts.loader); } return res.promise; } ALL_INITIALIZERS.push(init); if (typeof opts.webpack === "function") { READY_INITIALIZERS.push(function () { if (isWebpackReady(opts.webpack)) { return init(); } }); } return _temp = _class = /*#__PURE__*/ function (_React$Component) { _inheritsLoose(LoadableComponent, _React$Component); function LoadableComponent(props) { var _this; _this = _React$Component.call(this, props) || this; _defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "retry", function () { _this.setState({ error: null, loading: true, timedOut: false }); res = loadFn(opts.loader); _this._loadModule(); }); init(); _this.state = { error: res.error, pastDelay: false, timedOut: false, loading: res.loading, loaded: res.loaded }; return _this; } LoadableComponent.preload = function preload() { return init(); }; var _proto = LoadableComponent.prototype; _proto.UNSAFE_componentWillMount = function UNSAFE_componentWillMount() { this._loadModule(); }; _proto.componentDidMount = function componentDidMount() { this._mounted = true; }; _proto._loadModule = function _loadModule() { var _this2 = this; if (this.context.loadable && Array.isArray(opts.modules)) { opts.modules.forEach(function (moduleName) { _this2.context.loadable.report(moduleName); }); } if (!res.loading) { return; } var setStateWithMountCheck = function setStateWithMountCheck(newState) { if (!_this2._mounted) { return; } _this2.setState(newState); }; if (typeof opts.delay === 'number') { if (opts.delay === 0) { this.setState({ pastDelay: true }); } else { this._delay = setTimeout(function () { setStateWithMountCheck({ pastDelay: true }); }, opts.delay); } } if (typeof opts.timeout === "number") { this._timeout = setTimeout(function () { setStateWithMountCheck({ timedOut: true }); }, opts.timeout); } var update = function update() { setStateWithMountCheck({ error: res.error, loaded: res.loaded, loading: res.loading }); _this2._clearTimeouts(); }; res.promise.then(function () { update(); return null; }).catch(function (err) { update(); return null; }); }; _proto.componentWillUnmount = function componentWillUnmount() { this._mounted = false; this._clearTimeouts(); }; _proto._clearTimeouts = function _clearTimeouts() { clearTimeout(this._delay); clearTimeout(this._timeout); }; _proto.render = function render() { if (this.state.loading || this.state.error) { return React.createElement(opts.loading, { isLoading: this.state.loading, pastDelay: this.state.pastDelay, timedOut: this.state.timedOut, error: this.state.error, retry: this.retry }); } else if (this.state.loaded) { return opts.render(this.state.loaded, this.props); } else { return null; } }; return LoadableComponent; }(React.Component), _defineProperty(_class, "contextTypes", { loadable: PropTypes.shape({ report: PropTypes.func.isRequired }) }), _temp; } function Loadable(opts) { return createLoadableComponent(load, opts); } function LoadableMap(opts) { if (typeof opts.render !== "function") { throw new Error("LoadableMap requires a `render(loaded, props)` function"); } return createLoadableComponent(loadMap, opts); } Loadable.Map = LoadableMap; var Capture = /*#__PURE__*/ function (_React$Component2) { _inheritsLoose(Capture, _React$Component2); function Capture() { return _React$Component2.apply(this, arguments) || this; } var _proto2 = Capture.prototype; _proto2.getChildContext = function getChildContext() { return { loadable: { report: this.props.report } }; }; _proto2.render = function render() { return React.Children.only(this.props.children); }; return Capture; }(React.Component); _defineProperty(Capture, "propTypes", { report: PropTypes.func.isRequired }); _defineProperty(Capture, "childContextTypes", { loadable: PropTypes.shape({ report: PropTypes.func.isRequired }).isRequired }); Loadable.Capture = Capture; function flushInitializers(initializers) { var promises = []; while (initializers.length) { var init = initializers.pop(); promises.push(init()); } return Promise.all(promises).then(function () { if (initializers.length) { return flushInitializers(initializers); } }); } Loadable.preloadAll = function () { return new Promise(function (resolve, reject) { flushInitializers(ALL_INITIALIZERS).then(resolve, reject); }); }; Loadable.preloadReady = function () { return new Promise(function (resolve, reject) { // We always will resolve, errors should be handled within loading UIs. flushInitializers(READY_INITIALIZERS).then(resolve, resolve); }); }; module.exports = Loadable;