import { useState, useEffect } from 'preact/hooks';
import { MindforgeApiService, type FileTreeNode } from '../services/MindforgeApiService';
import './FileTreeComponent.css';
interface FileTreeComponentProps {
selectedPaths: string[];
onSelectionChange: (paths: string[]) => void;
}
interface FolderNodeProps {
node: FileTreeNode;
selectedPaths: string[];
onToggle: (path: string) => void;
}
function FolderNode({ node, selectedPaths, onToggle }: FolderNodeProps) {
const [expanded, setExpanded] = useState(true);
if (node.type === 'file') {
return (
);
}
return (
setExpanded(e => !e)}>
{expanded ? '▾' : '▸'}
{node.name}
{expanded && node.children && (
{node.children.map(child => (
))}
)}
);
}
export function FileTreeComponent({ selectedPaths, onSelectionChange }: FileTreeComponentProps) {
const [tree, setTree] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
MindforgeApiService.getRepositoryTree()
.then(setTree)
.catch(err => setError(err.message))
.finally(() => setLoading(false));
}, []);
const togglePath = (path: string) => {
if (selectedPaths.includes(path)) {
onSelectionChange(selectedPaths.filter(p => p !== path));
} else {
onSelectionChange([...selectedPaths, path]);
}
};
if (loading) return Carregando repositório...
;
if (error) return Erro ao carregar repositório: {error}
;
if (tree.length === 0) return Nenhum arquivo encontrado no repositório.
;
return (
{tree.map(node => (
))}
);
}