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') && (
{item.children.map(it => renderItem(it, depth + 1))}
)}
)
}
// 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.children.map(item => renderItem(item, 0))}
)
}
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