soiz1's picture
Upload 2891 files
6bcb42f verified
import bindAll from 'lodash.bindall';
import React from 'react';
import PropTypes from 'prop-types';
import {injectIntl, intlShape} from 'react-intl';
import {connect} from 'react-redux';
import {moveMonitorRect, resetMonitorLayout} from '../reducers/monitor-layout';
import errorBoundaryHOC from '../lib/error-boundary-hoc.jsx';
import OpcodeLabels from '../lib/opcode-labels';
import MonitorListComponent from '../components/monitor-list/monitor-list.jsx';
class MonitorList extends React.Component {
constructor (props) {
super(props);
bindAll(this, [
'handleMonitorChange'
]);
OpcodeLabels.setTranslatorFunction(props.intl.formatMessage);
this.state = {
key: 0
};
}
componentWillReceiveProps (nextProps) {
// TW: When stage size changes, we'll force all monitors to re-render completely
// This is important because the VM moves monitors after resize to preserve locations but
// Scratch's monitor layout logic is very complex and it won't notice that
if (this.props.customStageSize !== nextProps.customStageSize) {
this.props.resetMonitorLayout();
this.setState({
key: this.state.key + 1
});
}
}
handleMonitorChange (id, x, y) { // eslint-disable-line no-unused-vars
this.props.moveMonitorRect(id, x, y);
}
render () {
return (
<MonitorListComponent
onMonitorChange={this.handleMonitorChange}
key={this.state.key}
{...this.props}
/>
);
}
}
MonitorList.propTypes = {
intl: intlShape.isRequired,
customStageSize: PropTypes.shape({
width: PropTypes.number,
height: PropTypes.number
}),
monitorLayout: PropTypes.shape({
monitors: PropTypes.object, // eslint-disable-line react/forbid-prop-types
savedMonitorPositions: PropTypes.object // eslint-disable-line react/forbid-prop-types
}).isRequired,
moveMonitorRect: PropTypes.func.isRequired,
resetMonitorLayout: PropTypes.func
};
const mapStateToProps = state => ({
customStageSize: state.scratchGui.customStageSize,
monitors: state.scratchGui.monitors,
monitorLayout: state.scratchGui.monitorLayout
});
const mapDispatchToProps = dispatch => ({
moveMonitorRect: (id, x, y) => dispatch(moveMonitorRect(id, x, y)),
resetMonitorLayout: () => dispatch(resetMonitorLayout())
});
export default errorBoundaryHOC('Monitors')(
injectIntl(connect(
mapStateToProps,
mapDispatchToProps
)(MonitorList))
);