Files
001code-html--cocos/scratch-gui/src/containers/project-watcher.jsx
刘宇飞 6e0a1fbcbb Initial commit of 001code-html Scratch frontend project.
Includes scratch-gui, scratch-vm, scratch-blocks, scratch-render, scratch-l10n, and deployment config.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-16 15:37:45 +08:00

79 lines
1.9 KiB
JavaScript

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);