import PropTypes from 'prop-types'; import React from 'react'; import bindAll from 'lodash.bindall'; import VM from 'scratch-vm'; import PaintEditor from 'scratch-paint'; import analytics from '../lib/analytics'; import {connect} from 'react-redux'; class PaintEditorWrapper extends React.Component { constructor (props) { super(props); bindAll(this, [ 'handleUpdateImage', 'handleUpdateName' ]); } componentDidMount () { analytics.pageview('/editors/paint'); } handleUpdateName (name) { this.props.vm.renameCostume(this.props.selectedCostumeIndex, name); } handleUpdateImage (isVector, image, rotationCenterX, rotationCenterY) { if (isVector) { this.props.vm.updateSvg( this.props.selectedCostumeIndex, image, rotationCenterX, rotationCenterY); } else { this.props.vm.updateBitmap( this.props.selectedCostumeIndex, image, rotationCenterX, rotationCenterY, 2 /* bitmapResolution */); } } render () { if (!this.props.imageId) return null; return ( <PaintEditor {...this.props} image={this.props.vm.getCostume(this.props.selectedCostumeIndex)} onUpdateImage={this.handleUpdateImage} onUpdateName={this.handleUpdateName} /> ); } } PaintEditorWrapper.propTypes = { imageFormat: PropTypes.string.isRequired, imageId: PropTypes.string.isRequired, name: PropTypes.string, rotationCenterX: PropTypes.number, rotationCenterY: PropTypes.number, selectedCostumeIndex: PropTypes.number.isRequired, vm: PropTypes.instanceOf(VM) }; const mapStateToProps = (state, {selectedCostumeIndex}) => { const { editingTarget, sprites, stage } = state.scratchGui.targets; const target = editingTarget && sprites[editingTarget] ? sprites[editingTarget] : stage; const costume = target && target.costumes[selectedCostumeIndex]; return { name: costume && costume.name, rotationCenterX: costume && costume.rotationCenterX, rotationCenterY: costume && costume.rotationCenterY, imageFormat: costume && costume.dataFormat, imageId: editingTarget && `${editingTarget}${costume.skinId}`, vm: state.scratchGui.vm }; }; export default connect( mapStateToProps )(PaintEditorWrapper);