penguinmod-editor-2 / src /containers /project-watcher.jsx
soiz1's picture
Upload 2891 files
6bcb42f verified
import bindAll from 'lodash.bindall';
import PropTypes from 'prop-types';
import React from 'react';
import {connect} from 'react-redux';
import {
getIsShowingWithId
} from '../reducers/project-state';
/**
* Watches for project to finish updating before taking some action.
*
* To use ProjectWatcher, pass it a callback function using the onDoneUpdating prop.
* ProjectWatcher passes a waitForUpdate function to its children, which they can call
* to set ProjectWatcher to request that it call the onDoneUpdating callback when
* project is no longer updating.
*/
class ProjectWatcher extends React.Component {
constructor (props) {
super(props);
bindAll(this, [
'waitForUpdate'
]);
this.state = {
waiting: false
};
}
componentDidUpdate (prevProps) {
if (this.state.waiting && this.props.isShowingWithId && !prevProps.isShowingWithId) {
this.fulfill();
}
}
fulfill () {
this.props.onDoneUpdating();
this.setState({ // eslint-disable-line react/no-did-update-set-state
waiting: false
});
}
waitForUpdate (isUpdating) {
if (isUpdating) {
this.setState({
waiting: true
});
} else { // fulfill immediately
this.fulfill();
}
}
render () {
return this.props.children(
this.waitForUpdate
);
}
}
ProjectWatcher.propTypes = {
children: PropTypes.func,
isShowingWithId: PropTypes.bool,
onDoneUpdating: PropTypes.func
};
ProjectWatcher.defaultProps = {
onDoneUpdating: () => {}
};
const mapStateToProps = state => {
const loadingState = state.scratchGui.projectState.loadingState;
return {
isShowingWithId: getIsShowingWithId(loadingState)
};
};
const mapDispatchToProps = () => ({});
export default connect(
mapStateToProps,
mapDispatchToProps
)(ProjectWatcher);