import PropTypes from 'prop-types' import get from 'lodash.get' import React, {useEffect, useState} from 'react' import {IconCaretDown, IconFile, IconFolder} from '../icons' function Tree({ tree, selected, onClickItem }) { const [folders, setFolders] = useState([]) useEffect(() => { const treeToArray = map => { const recursive = (mapRec, acc) => { mapRec.forEach(item => { if (item.type === 'folder') { acc.push({ filename: get(item, 'filename'), path: get(item, 'path'), hidden: get(item, 'hidden', false), }) if (get(item, 'children')) { recursive(item.children, acc) } } }) return acc } return recursive(map, []) } setFolders(treeToArray(tree.children)) }, [tree, setFolders]) const renderItem = (item, depth = 0) => { if (item.type === 'folder') { const folder = folders.find(f => f.path === item.path) const isHidden = get(folder, `hidden`, true) return (
  • { e.preventDefault() const newFolders = [...folders] const newFolder = newFolders.find(f => f.path === item.path) if (newFolder) { newFolder.hidden = !get(newFolder, `hidden`, true) setFolders(newFolders) } }} > {get(item, 'children.length', 0) > 0 && } {item.filename} {get(item, 'children') && ( )}
  • ) } // File const isDisabled = get(item, 'language') === null const isSelected = get(selected, 'path') === get(item, 'path') return (
  • { e.preventDefault() if (!isDisabled) { onClickItem(item) } }} > {item.filename}
  • ) } return ( ) } Tree.propTypes = { tree: PropTypes.shape({ children: PropTypes.arrayOf( PropTypes.shape({ type: PropTypes.string, }) ), }).isRequired, selected: PropTypes.shape({ path: PropTypes.string.isRequired, }).isRequired, onClickItem: PropTypes.func.isRequired, } export default Tree