Spaces:
Sleeping
Sleeping
File size: 1,962 Bytes
cce8120 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | import React, { useEffect, useState } from 'react';
import { api } from '../../services/api';
export default function FileExplorer({ onSelectFile, activeFile }) {
const [files, setFiles] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
loadFiles();
}, []);
const loadFiles = async () => {
setLoading(true);
try {
const data = await api.getFiles();
setFiles(Array.isArray(data) ? data : []);
} catch (err) {
console.error("Failed to load workspace files:", err);
} finally {
setLoading(false);
}
};
return (
<div className="w-64 bg-slate-900 text-slate-300 border-r border-slate-800 flex flex-col h-full select-none">
<div className="p-3 border-b border-slate-800 font-semibold text-xs uppercase tracking-wider text-slate-400 flex justify-between items-center">
<span>Explorer</span>
<button onClick={loadFiles} className="hover:text-white transition-colors">π</button>
</div>
<div className="flex-1 overflow-y-auto p-2 text-sm">
{loading ? (
<div className="p-3 text-slate-500 text-xs">Loading tree...</div>
) : files.length === 0 ? (
<div className="p-3 text-slate-500 text-xs">No files found.</div>
) : (
files.map((file) => (
<div
key={file.path || file.name}
onClick={() => onSelectFile(file.path || file.name)}
className={`px-3 py-1.5 rounded cursor-pointer flex items-center gap-2 transition-colors ${
activeFile === (file.path || file.name)
? 'bg-blue-600 text-white font-medium'
: 'hover:bg-slate-800 text-slate-300'
}`}
>
<span>{file.is_dir ? 'π' : 'π'}</span>
<span className="truncate">{file.name || file.path}</span>
</div>
))
)}
</div>
</div>
);
}
|