import React, { useState } from 'react';
import { Folder, FolderOpen, FileCode, ChevronRight, ChevronDown, GitBranch } from 'lucide-react';
function TreeNode({ name, node }) {
const isDir = node.type === 'directory';
const [open, setOpen] = useState(false);
const fmtSize = (b) => {
if (!b) return '';
if (b < 1024) return `${b}B`;
if (b < 1024 * 1024) return `${(b / 1024).toFixed(1)}KB`;
return `${(b / (1024 * 1024)).toFixed(1)}MB`;
};
return (
isDir && setOpen(!open)}
style={{ paddingLeft: 0 }}
>
{isDir ? (
<>
{open
?
:
}
{open
?
:
}
{name}
>
) : (
<>
{name}
{node.size !== undefined && (
{fmtSize(node.size)}
)}
>
)}
{isDir && open && node.children && (
{Object.entries(node.children)
.sort(([, a], [, b]) => {
if (a.type === 'directory' && b.type !== 'directory') return -1;
if (a.type !== 'directory' && b.type === 'directory') return 1;
return 0;
})
.map(([n, c]) => )
}
)}
);
}
export default function RepoTree({ tree, title }) {
if (!tree || Object.keys(tree).length === 0) {
return (
No file tree available.
);
}
return (
{title || 'Repository'}
{Object.entries(tree)
.sort(([, a], [, b]) => {
if (a.type === 'directory' && b.type !== 'directory') return -1;
if (a.type !== 'directory' && b.type === 'directory') return 1;
return 0;
})
.map(([n, node]) => )
}
);
}