nyg-jam3
Version:
Jam3 project scaffold generator based on nyg
116 lines (97 loc) • 2.66 kB
JavaScript
import React from 'react';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import preloader from 'preloader';
import noop from 'no-op';
import wait from '@jam3/wait';
import checkProps from '@jam3/react-check-extra-props';
import './Preloader.scss';
import { ReactComponent as LoaderIcon } from '../../assets/svg/loader.svg';
import animate from '../../util/gsap-animate';
import { setProgress, setReady } from '../../redux/modules/preloader';
import preloadAssets from '../../data/preload-assets';
class Preloader extends React.PureComponent {
async componentDidMount() {
await Promise.all([this.setTimer(), this.setLoader()]);
this.setDone();
}
animateOut(onComplete) {
return animate.to(this.container, 0.3, { autoAlpha: 0, onComplete });
}
async setTimer() {
return await wait(this.props.minDisplayTime);
}
setLoader() {
return new Promise((resolve, reject) => {
this.loader = preloader(this.props.options);
this.props.assets.forEach(file => this.add(file));
this.loader.on('progress', this.onProgress);
this.loader.on('complete', () => this.onComplete(resolve));
this.load();
});
}
add(url, options = {}) {
this.loader.add(url, options);
}
load() {
this.loader.load();
}
onProgress = val => {
this.props.setProgress(val);
};
onComplete = done => {
this.props.setProgress(1);
done();
};
setDone = async () => {
await this.animateOut();
this.props.setReady(true);
};
render() {
return (
<section id="Preloader" ref={r => (this.container = r)}>
<LoaderIcon className="loader-icon" />
</section>
);
}
}
Preloader.propTypes = checkProps({
className: PropTypes.string,
assets: PropTypes.array.isRequired,
setProgress: PropTypes.func.isRequired,
setReady: PropTypes.func.isRequired,
minDisplayTime: PropTypes.number,
options: PropTypes.object,
progress: PropTypes.number,
transitionState: PropTypes.string
});
Preloader.defaultProps = {
className: '',
assets: [],
minDisplayTime: 300, // in milliseconds
options: {
xhrImages: false,
loadFullAudio: false,
loadFullVideo: false,
onProgress: noop,
onComplete: noop
}
};
const mapStateToProps = (state, ownProps) => {
return {
progress: state.preloader.progress,
assets: preloadAssets
};
};
const mapDispatchToProps = dispatch => {
return {
setProgress: val => dispatch(setProgress(val)),
setReady: val => dispatch(setReady(val))
};
};
export default connect(
mapStateToProps,
mapDispatchToProps,
undefined,
{ withRef: true }
)(Preloader);