import React from 'react'; import PropTypes from 'prop-types'; import MenuControl from '../menu-control'; import { permission } from '../../utils/constants'; const propTypes = { isNodeItemFrezee: PropTypes.bool.isRequired, currentFilePath: PropTypes.string.isRequired, paddingLeft: PropTypes.number.isRequired, node: PropTypes.object.isRequired, treeView: PropTypes.object.isRequired, onDirCollapse: PropTypes.func.isRequired, }; function sortByType(a, b) { if (a.type == 'dir' && b.type != 'dir') { return -1; } else if (a.type != 'dir' && b.type == 'dir') { return 1; } else { return a.name.localeCompare(b.name); } } class TreeNodeView extends React.Component { constructor(props) { super(props); this.state = { isMenuIconShow: false }; } onClick = (e) => { // e.nativeEvent.stopImmediatePropagation(); let { node } = this.props; this.props.treeView.onNodeClick(e, node); } onMouseEnter = () => { if (!this.props.isNodeItemFrezee) { this.setState({ isMenuIconShow: true }); } } onMouseLeave = () => { if (!this.props.isNodeItemFrezee) { this.setState({ isMenuIconShow: false }); } } handleCollapse = (e) => { e.stopPropagation(); this.props.onDirCollapse(e, this.props.node); } onDragStart = (e) => { const { node } = this.props; this.props.treeView.onDragStart(e, node); } onMenuControlClick = (e) => { e.stopPropagation(); e.nativeEvent.stopImmediatePropagation(); const { node } = this.props; this.props.treeView.onShowContextMenu(e, node); } hideMenuIcon = () => { this.setState({ isMenuIconShow: false }); } componentDidMount() { document.addEventListener('click', this.hideMenuIcon); } componentWillUnmount() { document.removeEventListener('click', this.hideMenuIcon); } renderCollapse = () => { const { node } = this.props; if (node.hasChildren()) { const { isExpanded } = node; return ( e.stopPropagation()} onClick={this.handleCollapse} /> ); } return null; } renderChildren = () => { const { node } = this.props; if (node.children && node.children.length) { const childrenStyles = { paddingLeft: this.props.paddingLeft }; var l = node.children.sort(sortByType); /* the `key` property is needed. Otherwise there is a warning in the console */ return (
{l.map(child => { return ( ); })}
); } return null; } renderMenuController() { if (permission) { let isShow = (this.props.node.path === this.props.currentFilePath); return (
); } return; } getNodeTypeAndIcon() { const node = this.props.node; let icon = ''; let type = ''; if (node.type === 'dir') { icon = ; type = 'dir'; } else { let index = node.name.lastIndexOf('.'); if (index === -1) { icon = ; type = 'file'; } else { type = node.name.substring(index).toLowerCase(); if (type === '.png' || type === '.jpg') { icon = ; type = 'image'; } else { icon = ; type = 'file'; } } } return { type, icon }; } render() { const styles = {}; let node = this.props.node; let { type, icon } = this.getNodeTypeAndIcon(); let hlClass = ''; if (node.path === this.props.currentFilePath) { hlClass = 'tree-node-hight-light'; } return (
{node.name}
{this.renderCollapse()} {icon}
{this.renderMenuController()}
{node.isExpanded ? this.renderChildren() : null}
); } } TreeNodeView.propTypes = propTypes; export default TreeNodeView;