import { FileCode01Icon, LayoutAlt01Icon, 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]) => { const FileIcon = getIconForFile(key); return Object.keys(value).length ? (
{' '.repeat(level)} {key}
{renderStructure(value, level + 1)}
) : (
{' '.repeat(Math.max(level - 1, 0))} {key}
); }); } function getIconForFile(filename: string) { if (/_layout\.[jt]sx?/.test(filename)) { return LayoutAlt01Icon; } return FileCode01Icon; }