import React from 'react'; import PropTypes from 'prop-types'; import {promiseAllObject} from 'core/utils'; import ng from 'core/services/ng'; interface IPropsReactRenderAsync { promises: any; originalProps: any; component: React.ComponentType; } interface IStateReactRenderAsync { loading: boolean; mappedProps: any; } class ReactRenderAsync extends React.Component { static propTypes: any; static defaultProps: any; private _mounted: boolean; constructor(props) { super(props); this.state = { loading: true, mappedProps: {}, }; } componentWillUnmount() { this._mounted = false; } componentDidMount() { this._mounted = true; promiseAllObject(this.props.promises) .then((result) => { if (this._mounted === true) { this.setState({ loading: false, mappedProps: result, }); } }) .catch((err) => { console.error(err); }); } render() { const Component = this.props.component; return this.state.loading === true ? null : ; } } ReactRenderAsync.propTypes = { promises: PropTypes.object, component: PropTypes.func, originalProps: PropTypes.object, }; /* eslint-disable react/no-multi-comp */ export function connectPromiseResults(getPromises) { return function(component): React.ComponentType { return function connectPromiseComponent(props) { return ( ); }; }; } export function connectServices(component: React.ComponentType, services) { return connectPromiseResults(() => { const promisesObject = {}; services.forEach((serviceName) => { promisesObject[serviceName] = ng.getService(serviceName); }); return promisesObject; })(component); }