import { useState } from 'react' import { ProjectFile } from '@/types/project' import { ScrollArea } from '@/components/ui/scroll-area' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Textarea } from '@/components/ui/textarea' import { FileCode, FolderOpen, Plus, Folder, Sparkle } from '@phosphor-icons/react' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, } from '@/components/ui/dialog' import { Label } from '@/components/ui/label' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import { AIService } from '@/lib/ai-service' import { toast } from 'sonner' interface FileExplorerProps { files: ProjectFile[] activeFileId: string | null onFileSelect: (fileId: string) => void onFileAdd: (file: ProjectFile) => void } export function FileExplorer({ files, activeFileId, onFileSelect, onFileAdd, }: FileExplorerProps) { const [isAddDialogOpen, setIsAddDialogOpen] = useState(false) const [newFileName, setNewFileName] = useState('') const [newFileLanguage, setNewFileLanguage] = useState('typescript') const [aiDescription, setAiDescription] = useState('') const [aiFileType, setAiFileType] = useState<'component' | 'page' | 'api' | 'utility'>('component') const [isGenerating, setIsGenerating] = useState(false) const handleAddFile = () => { if (!newFileName.trim()) return const newFile: ProjectFile = { id: `file-${Date.now()}`, name: newFileName, path: `/src/${newFileName}`, content: '', language: newFileLanguage, } onFileAdd(newFile) setNewFileName('') setIsAddDialogOpen(false) } const handleGenerateFileWithAI = async () => { if (!aiDescription.trim() || !newFileName.trim()) { toast.error('Please provide both a filename and description') return } try { setIsGenerating(true) toast.info('Generating code with AI...') const code = await AIService.generateCodeFromDescription(aiDescription, aiFileType) if (code) { const newFile: ProjectFile = { id: `file-${Date.now()}`, name: newFileName, path: `/src/${newFileName}`, content: code, language: newFileLanguage, } onFileAdd(newFile) setNewFileName('') setAiDescription('') setIsAddDialogOpen(false) toast.success('File generated successfully!') } else { toast.error('AI generation failed. Please try again.') } } catch (error) { toast.error('Failed to generate file') console.error(error) } finally { setIsGenerating(false) } } const groupedFiles = files.reduce((acc, file) => { const dir = file.path.split('/').slice(0, -1).join('/') || '/' if (!acc[dir]) acc[dir] = [] acc[dir].push(file) return acc }, {} as Record) return (

Files

Add New File Manual AI Generate
setNewFileName(e.target.value)} placeholder="example.tsx" onKeyDown={(e) => { if (e.key === 'Enter') handleAddFile() }} />
setNewFileName(e.target.value)} placeholder="UserCard.tsx" />