import React, { PropTypes } from 'react'; import * as FileActions from '../actions/files'; import * as IDEActions from '../actions/ide'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; import InlineSVG from 'react-inlinesvg'; const downArrowUrl = require('../../../images/down-arrow.svg'); import classNames from 'classnames'; export class FileNode extends React.Component { constructor(props) { super(props); this.renderChild = this.renderChild.bind(this); this.handleKeyPress = this.handleKeyPress.bind(this); this.handleFileNameChange = this.handleFileNameChange.bind(this); this.validateFileName = this.validateFileName.bind(this); this.handleFileClick = this.handleFileClick.bind(this); } handleFileClick(e) { e.stopPropagation(); this.props.setSelectedFile(this.props.id); } handleFileNameChange(event) { this.props.updateFileName(this.props.id, event.target.value); } handleKeyPress(event) { if (event.key === 'Enter') { this.props.hideEditFileName(this.props.id); } } validateFileName() { const oldFileExtension = this.originalFileName.match(/\.[0-9a-z]+$/i); const newFileExtension = this.props.name.match(/\.[0-9a-z]+$/i); if (oldFileExtension && !newFileExtension) { this.props.updateFileName(this.props.id, this.originalFileName); } if (oldFileExtension && newFileExtension && oldFileExtension[0] !== newFileExtension[0]) { this.props.updateFileName(this.props.id, this.originalFileName); } } renderChild(childId) { return (
  • ); } render() { let itemClass = classNames({ 'sidebar__file-item': this.props.name !== 'root', 'sidebar__file-item--selected': this.props.isSelected, 'sidebar__file-item--open': this.props.isOptionsOpen, 'sidebar__file-item--editing': this.props.isEditingName }); return (
    setTimeout(() => this.props.hideFileOptions(this.props.id), 100)} > {(() => { // eslint-disable-line if (this.props.name !== 'root') { return (
    {this.props.name} { this.validateFileName(); this.props.hideEditFileName(this.props.id); }} onKeyPress={this.handleKeyPress} />
    ); } })()} {(() => { // eslint-disable-line if (this.props.children) { return ( ); } })()}
    ); } } FileNode.propTypes = { id: PropTypes.string.isRequired, parentId: PropTypes.string, children: PropTypes.array, name: PropTypes.string.isRequired, isSelected: PropTypes.bool, isOptionsOpen: PropTypes.bool, isEditingName: PropTypes.bool, setSelectedFile: PropTypes.func.isRequired, showFileOptions: PropTypes.func.isRequired, hideFileOptions: PropTypes.func.isRequired, deleteFile: PropTypes.func.isRequired, showEditFileName: PropTypes.func.isRequired, hideEditFileName: PropTypes.func.isRequired, updateFileName: PropTypes.func.isRequired, resetSelectedFile: PropTypes.func.isRequired }; function mapStateToProps(state, ownProps) { // this is a hack, state is updated before ownProps return state.files.find((file) => file.id === ownProps.id) || { ...ownProps, name: 'test' }; } function mapDispatchToProps(dispatch) { return bindActionCreators(Object.assign(FileActions, IDEActions), dispatch); } const ConnectedFileNode = connect(mapStateToProps, mapDispatchToProps)(FileNode); export default ConnectedFileNode;