UNPKG

@lytrax/async-reactor

Version:

Render async Stateless Functional Components

1 lines 2.97 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.asyncReactor=asyncReactor;var _react=require("react"),_element=require("./element");function ownKeys(object,enumerableOnly){var keys=Object.keys(object);if(Object.getOwnPropertySymbols){var symbols=Object.getOwnPropertySymbols(object);enumerableOnly&&(symbols=symbols.filter(function(sym){return Object.getOwnPropertyDescriptor(object,sym).enumerable})),keys.push.apply(keys,symbols)}return keys}function _objectSpread(target){for(var source,i=1;i<arguments.length;i++)source=null==arguments[i]?{}:arguments[i],i%2?ownKeys(Object(source),!0).forEach(function(key){_defineProperty(target,key,source[key])}):Object.getOwnPropertyDescriptors?Object.defineProperties(target,Object.getOwnPropertyDescriptors(source)):ownKeys(Object(source)).forEach(function(key){Object.defineProperty(target,key,Object.getOwnPropertyDescriptor(source,key))});return target}function _defineProperty(obj,key,value){return key in obj?Object.defineProperty(obj,key,{value:value,enumerable:!0,configurable:!0,writable:!0}):obj[key]=value,obj}function interopRequireModule(obj){return obj&&obj.__esModule?obj.default:obj}function isFunction(p){return"function"==typeof p}function isPromise(){var p=0<arguments.length&&arguments[0]!==void 0?arguments[0]:{};return p&&isFunction(p.then)}class Reactor extends _react.Component{constructor(props){super(props),this.state={},this._passthroughProps=props.passthroughProps}_handleError(error){var errorComponent=this.props.error;if(errorComponent&&this._isMounted)this._passthroughProps=_objectSpread(_objectSpread({},this._passthroughProps),{},{error}),this._setResult(errorComponent);else throw error}_setResult(data){this._isMounted&&this.setState({data:interopRequireModule(data)})}componentDidMount(){this._isMounted=!0;var promise;if(promise=isPromise(this.props.wait)?this.props.wait:this.props.wait(this._passthroughProps),!isPromise(promise))throw new Error("You must provide an async component");promise.then(data=>this._setResult(data),err=>this._handleError(err))}componentWillUnmount(){this._isMounted=!1}render(){if("data"in this.state){var renderer=this.state.data;return isFunction(renderer)?/*#__PURE__*/(0,_react.createElement)(renderer,this._passthroughProps):renderer}return/*#__PURE__*/(0,_react.createElement)(this.props.loader,this._passthroughProps)}}function asyncReactor(component,loaderComponent,errorComponent){if(/*#__PURE__*/(0,_react.isValidElement)(component))throw new Error("Incompatible React element given, please change"+" asyncReactor(<".concat(component.type.name," />) to asyncReactor(").concat(component.type.name,")."));if(loaderComponent||(loaderComponent="div"),errorComponent||(errorComponent="div"),!isFunction(component)&&!isPromise(component))throw new Error("You must provide an async component, ".concat(JSON.stringify(component)," given"));return(0,_element.createReactorElement)(Reactor,component,loaderComponent,errorComponent)}