import { useEffect, useRef, useState } from 'react'; import { listDocuments, type DocumentFile } from '../api/client'; interface FileExplorerProps { onSelectFile: (key: string) => void; selectedKey?: string | null; refreshKey?: number; } export default function FileExplorer({ onSelectFile, selectedKey, refreshKey }: FileExplorerProps) { const [folders, setFolders] = useState([]); const [files, setFiles] = useState([]); const [error, setError] = useState(null); useEffect(() => { listDocuments('') .then((data) => { setFolders(data.folders); setFiles(data.files); }) .catch(() => setError('无法加载文档目录')); }, [refreshKey]); if (error) { return
{error}
; } return (
{folders.map((folder) => ( ))} {files.map((file) => ( ))}
); } function SidebarLabel({ text }: { text: string }) { const ref = useRef(null); const [overflows, setOverflows] = useState(false); useEffect(() => { const el = ref.current; if (!el) return; const check = () => setOverflows(el.scrollWidth > el.clientWidth); check(); const ro = new ResizeObserver(check); ro.observe(el); return () => ro.disconnect(); }, [text]); return ( {text} ); } function FileRow({ file, onSelectFile, selectedKey, }: { file: DocumentFile; onSelectFile: (key: string) => void; selectedKey?: string | null; }) { return (
onSelectFile(file.key)} >
); } function FolderNode({ name, path, onSelectFile, selectedKey, }: { name: string; path: string; onSelectFile: (key: string) => void; selectedKey?: string | null; }) { const [expanded, setExpanded] = useState(false); const [loaded, setLoaded] = useState(false); const [folders, setFolders] = useState([]); const [files, setFiles] = useState([]); function toggle() { if (!expanded && !loaded) { listDocuments(path).then((data) => { setFolders(data.folders); setFiles(data.files); setLoaded(true); }); } setExpanded((prev) => !prev); } return (
{expanded && (
{folders.map((folder) => ( ))} {files.map((file) => ( ))}
)}
); }