import React, { useRef, useState, useLayoutEffect } from 'react'; import { Tree } from 'react-arborist'; import { IconFile, IconFolder, IconFolderOpen } from '@tabler/icons-react'; import { Tooltip } from '@mantine/core'; import useResizeObserver from '@react-hook/resize-observer'; const useSize = (target) => { const [size, setSize] = useState(); useLayoutEffect(() => { setSize(target.current.getBoundingClientRect()); }, [target]); useResizeObserver(target, (entry) => setSize(entry.contentRect)); return size; }; const FileIcon = ({ node }) => { if (node.isLeaf) { return ; } return node.isOpen ? ( ) : ( ); }; const Node = ({ node, style, dragHandle }) => { return (
{ if (node.isInternal) { node.toggle(); } else { node.tree.props.onNodeClick(node); } }} > {node.data.name}
); }; const FileTree = ({ files, handleFileSelect }) => { const target = useRef(null); const size = useSize(target); return (
{size && ( { if (!node.isInternal) { handleFileSelect(node.data.path); } }} onNodeClick={(node) => { if (!node.isInternal) { handleFileSelect(node.data.path); } }} > {Node} )}
); }; export default FileTree;