Newer
Older
import bindAll from 'lodash.bindall';
import React from 'react';
import {activateTab, COSTUMES_TAB_INDEX} from '../reducers/editor-tab';
import {setReceivedBlocks} from '../reducers/hovered-target';
import TargetPaneComponent from '../components/target-pane/target-pane.jsx';
import spriteLibraryContent from '../lib/libraries/sprites.json';
class TargetPane extends React.Component {
constructor (props) {
super(props);
bindAll(this, [
'handleBlockDragEnd',
'handleChangeSpriteSize',
'handleChangeSpriteVisibility',
'handleSelectSprite',
'handleSurpriseSpriteClick',
'handlePaintSpriteClick'
componentDidMount () {
this.props.vm.addListener('BLOCK_DRAG_END', this.handleBlockDragEnd);
}
componentWillUnmount () {
this.props.vm.removeListener('BLOCK_DRAG_END', this.handleBlockDragEnd);
}
handleChangeSpriteDirection (direction) {
this.props.vm.postSpriteInfo({direction});
handleChangeSpriteName (name) {
this.props.vm.renameSprite(this.props.editingTarget, name);
handleChangeSpriteSize (size) {
this.props.vm.postSpriteInfo({size});
handleChangeSpriteVisibility (visible) {
this.props.vm.postSpriteInfo({visible});
handleDeleteSprite (id) {
this.props.vm.deleteSprite(id);
}
handleDuplicateSprite (id) {
this.props.vm.duplicateSprite(id);
}
handleSelectSprite (id) {
this.props.vm.setEditingTarget(id);
}
handleSurpriseSpriteClick () {
const item = spriteLibraryContent[Math.floor(Math.random() * spriteLibraryContent.length)];
this.props.vm.addSprite2(JSON.stringify(item.json));
}
handlePaintSpriteClick () {
// @todo this is brittle, will need to be refactored for localized libraries
const emptyItem = spriteLibraryContent.find(item => item.name === 'Empty');
if (emptyItem) {
this.props.vm.addSprite2(JSON.stringify(emptyItem.json)).then(() => {
this.props.onActivateTab(COSTUMES_TAB_INDEX);
});
}
}
handleBlockDragEnd (blocks) {
if (this.props.hoveredTarget.sprite && this.props.hoveredTarget.sprite !== this.props.editingTarget) {
this.props.vm.shareBlocksToTarget(blocks, this.props.hoveredTarget.sprite);
this.props.onReceivedBlocks(true);
}
}
const {
onActivateTab, // eslint-disable-line no-unused-vars
...componentProps
} = this.props;
onChangeSpriteDirection={this.handleChangeSpriteDirection}
onChangeSpriteName={this.handleChangeSpriteName}
onChangeSpriteSize={this.handleChangeSpriteSize}
onChangeSpriteVisibility={this.handleChangeSpriteVisibility}
onChangeSpriteX={this.handleChangeSpriteX}
onChangeSpriteY={this.handleChangeSpriteY}
onDeleteSprite={this.handleDeleteSprite}
onDuplicateSprite={this.handleDuplicateSprite}
onPaintSpriteClick={this.handlePaintSpriteClick}
onSurpriseSpriteClick={this.handleSurpriseSpriteClick}
/>
);
}
}
const {
onSelectSprite, // eslint-disable-line no-unused-vars
} = TargetPaneComponent.propTypes;
TargetPane.propTypes = {
};
const mapStateToProps = state => ({
editingTarget: state.targets.editingTarget,
sprites: Object.keys(state.targets.sprites).reduce((sprites, k) => {
let {direction, size, x, y, ...sprite} = state.targets.sprites[k];
if (typeof direction !== 'undefined') direction = Math.round(direction);
if (typeof x !== 'undefined') x = Math.round(x);
if (typeof y !== 'undefined') y = Math.round(y);
if (typeof size !== 'undefined') size = Math.round(size);
sprites[k] = {...sprite, direction, size, x, y};
raiseSprites: state.blockDrag,
spriteLibraryVisible: state.modals.spriteLibrary
});
const mapDispatchToProps = dispatch => ({
onNewSpriteClick: e => {
e.preventDefault();
dispatch(openSpriteLibrary());
},
onRequestCloseSpriteLibrary: () => {
dispatch(closeSpriteLibrary());
onActivateTab: tabIndex => {
dispatch(activateTab(tabIndex));
},
onReceivedBlocks: receivedBlocks => {
dispatch(setReceivedBlocks(receivedBlocks));