Skip to content

Instantly share code, notes, and snippets.

@simenbrekken
Created April 5, 2016 11:36
Show Gist options
  • Save simenbrekken/8dd2c16a6a88a8201fd18874b33daa9a to your computer and use it in GitHub Desktop.
Save simenbrekken/8dd2c16a6a88a8201fd18874b33daa9a to your computer and use it in GitHub Desktop.
Loader decorator factory
import React from 'react';
import PureComponent from 'react-pure-render/component';
import { getDisplayName } from '../utils';
function getComponentRequiredProps({ propTypes }) {
return Object.keys(propTypes).filter(key => !propTypes[key].isRequired);
}
export default function(loader = null, ownRequiredProps) {
return WrappedComponent => {
const requiredProps = ownRequiredProps || getComponentRequiredProps(WrappedComponent);
class Loader extends PureComponent {
render() {
const loaded = requiredProps.every(key => this.props[key]);
if (!loaded) {
return !loader || React.isValidElement(loader) ? loader : loader(this.props);
}
return (
<WrappedComponent {...this.props} />
);
}
}
Loader.displayName = `Loader(${getDisplayName(WrappedComponent)})`;
Loader.WrappedComponent = WrappedComponent;
return Loader;
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment