import { useState } from 'react' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Textarea } from '@/components/ui/textarea' import { 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 { ProjectFile } from '@/types/project' import { toast } from 'sonner' import fileExplorerCopy from '@/data/file-explorer.json' import { Plus } from '@phosphor-icons/react' interface FileExplorerDialogProps { onFileAdd: (file: ProjectFile) => void } export function FileExplorerDialog({ onFileAdd }: FileExplorerDialogProps) { 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(fileExplorerCopy.toast.missingFields) return } try { setIsGenerating(true) toast.info(fileExplorerCopy.toast.generating) 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(fileExplorerCopy.toast.generated) } else { toast.error(fileExplorerCopy.toast.generationFailed) } } catch (error) { toast.error(fileExplorerCopy.toast.generationError) console.error(error) } finally { setIsGenerating(false) } } return ( {fileExplorerCopy.dialog.title} {fileExplorerCopy.dialog.tabs.manual} {fileExplorerCopy.dialog.tabs.ai}
setNewFileName(e.target.value)} placeholder={fileExplorerCopy.dialog.placeholders.manualFileName} onKeyDown={(e) => { if (e.key === 'Enter') handleAddFile() }} />
setNewFileName(e.target.value)} placeholder={fileExplorerCopy.dialog.placeholders.aiFileName} />