Spaces:
Running
Running
File size: 1,987 Bytes
f2bee8a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
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);
|