2025-03-30 16:42:51 -03:00
|
|
|
import { useState, useEffect } from 'react';
|
2025-03-30 21:47:18 -03:00
|
|
|
import { core } from '@tauri-apps/api';
|
2025-03-30 16:42:51 -03:00
|
|
|
|
|
|
|
interface FileItem {
|
|
|
|
name: string;
|
|
|
|
path: string;
|
|
|
|
is_dir: boolean;
|
|
|
|
}
|
|
|
|
|
2025-03-30 19:28:28 -03:00
|
|
|
interface FileBrowserProps {
|
|
|
|
path: string;
|
|
|
|
onFileSelect?: (path: string) => void;
|
|
|
|
}
|
|
|
|
|
|
|
|
export function FileBrowser({ path, onFileSelect }: FileBrowserProps) {
|
2025-03-30 16:42:51 -03:00
|
|
|
const [files, setFiles] = useState<FileItem[]>([]);
|
|
|
|
const [loading, setLoading] = useState(false);
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
const loadFiles = async () => {
|
|
|
|
setLoading(true);
|
|
|
|
try {
|
2025-03-30 21:47:18 -03:00
|
|
|
const result = await core.invoke<FileItem[]>('list_files', { path });
|
2025-03-30 16:42:51 -03:00
|
|
|
setFiles(result);
|
|
|
|
} catch (error) {
|
|
|
|
console.error('Error listing files:', error);
|
|
|
|
} finally {
|
|
|
|
setLoading(false);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
loadFiles();
|
|
|
|
}, [path]);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<div className="flex-1 p-4">
|
|
|
|
<h3 className="text-lg font-semibold mb-4">File Browser: {path || 'Root'}</h3>
|
|
|
|
{loading ? (
|
|
|
|
<p>Loading...</p>
|
|
|
|
) : (
|
|
|
|
<ul className="space-y-1">
|
|
|
|
{files.map((file) => (
|
2025-03-30 19:28:28 -03:00
|
|
|
<li
|
|
|
|
key={file.path}
|
|
|
|
className={`p-2 hover:bg-gray-100 rounded cursor-pointer ${file.is_dir ? 'font-medium' : ''}`}
|
|
|
|
onClick={() => onFileSelect && onFileSelect(file.path)}
|
|
|
|
>
|
2025-03-30 16:42:51 -03:00
|
|
|
{file.is_dir ? '📁' : '📄'} {file.name}
|
|
|
|
</li>
|
|
|
|
))}
|
|
|
|
</ul>
|
|
|
|
)}
|
|
|
|
</div>
|
|
|
|
);
|
2025-03-30 19:28:28 -03:00
|
|
|
}
|