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