import React, { useState, useEffect } from 'react'; import { ScrollArea } from './ui/scroll-area'; import { Button } from './ui/button'; import { Folder, FolderOpen, File, FileText, FileCode } from 'lucide-react'; import { cn } from '../lib/utils'; import CodeEditor from './CodeEditor'; import ImageViewer from './ImageViewer'; import { api } from '../utils/api'; function FileTree({ selectedProject }) { const [files, setFiles] = useState([]); const [loading, setLoading] = useState(false); const [expandedDirs, setExpandedDirs] = useState(new Set()); const [selectedFile, setSelectedFile] = useState(null); const [selectedImage, setSelectedImage] = useState(null); useEffect(() => { if (selectedProject) { fetchFiles(); } }, [selectedProject]); const fetchFiles = async () => { setLoading(true); try { const response = await api.getFiles(selectedProject.name); if (!response.ok) { const errorText = await response.text(); console.error('❌ File fetch failed:', response.status, errorText); setFiles([]); return; } const data = await response.json(); setFiles(data); } catch (error) { console.error('❌ Error fetching files:', error); setFiles([]); } finally { setLoading(false); } }; const toggleDirectory = (path) => { const newExpanded = new Set(expandedDirs); if (newExpanded.has(path)) { newExpanded.delete(path); } else { newExpanded.add(path); } setExpandedDirs(newExpanded); }; const renderFileTree = (items, level = 0) => { return items.map((item) => (
{item.type === 'directory' && expandedDirs.has(item.path) && item.children && item.children.length > 0 && (
{renderFileTree(item.children, level + 1)}
)}
)); }; const isImageFile = (filename) => { const ext = filename.split('.').pop()?.toLowerCase(); const imageExtensions = ['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp', 'ico', 'bmp']; return imageExtensions.includes(ext); }; const getFileIcon = (filename) => { const ext = filename.split('.').pop()?.toLowerCase(); const codeExtensions = ['js', 'jsx', 'ts', 'tsx', 'py', 'java', 'cpp', 'c', 'php', 'rb', 'go', 'rs']; const docExtensions = ['md', 'txt', 'doc', 'pdf']; const imageExtensions = ['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp', 'ico', 'bmp']; if (codeExtensions.includes(ext)) { return ; } else if (docExtensions.includes(ext)) { return ; } else if (imageExtensions.includes(ext)) { return ; } else { return ; } }; if (loading) { return (
Loading files...
); } return (
{files.length === 0 ? (

No files found

Check if the project path is accessible

) : (
{renderFileTree(files)}
)}
{/* Code Editor Modal */} {selectedFile && ( setSelectedFile(null)} projectPath={selectedFile.projectPath} /> )} {/* Image Viewer Modal */} {selectedImage && ( setSelectedImage(null)} /> )}
); } export default FileTree;