import { FileCode01Icon, FolderIcon } from '@expo/styleguide-icons'; import { HTMLAttributes, ReactNode } from 'react'; type FileTreeProps = HTMLAttributes & { files?: string[]; }; type FileObject = { [key: string]: FileObject; }; export function FileTree({ files = [], ...rest }: FileTreeProps) { return (
{renderStructure(generateStructure(files))}
); } function generateStructure(files: string[]): FileObject { const structure = {}; files.forEach(path => path.split('/').reduce((acc: FileObject, key) => acc[key] ?? (acc[key] = {}), structure) ); return structure; } function renderStructure(structure: FileObject, level = 0): ReactNode { return Object.entries(structure).map(([key, value]) => { return Object.keys(value).length ? (
{' '.repeat(level)} {key}
{renderStructure(value, level + 1)}
) : (
{' '.repeat(level - 1)} {key}
); }); }