"use client"; import React, { useState, useEffect, useCallback } from 'react'; import { FileDocument, FolderDocument } from '@/types'; import { FileExplorer } from './file-explorer'; import { MultiTabEditor } from './editor/multi-tab-editor'; import { ProjectGenerator } from './ai/project-generator'; import { SmartEditor } from './ai/smart-editor'; import { PromptSystem } from './ai/prompt-system'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { ResizableHandle, ResizablePanel, ResizablePanelGroup, } from '@/components/ui/resizable'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { Dialog, DialogContent, // DialogDescription, // DialogHeader, // DialogTitle, } from '@/components/ui/dialog'; import { // Sidebar, // SidebarContent, // SidebarHeader, // SidebarProvider, // SidebarTrigger, } from '@/components/ui/sidebar'; import { Wand2, // Brain, MessageSquare, Settings, Save, Download, Upload, RefreshCw, Maximize2, // Minimize2, Layout, // Code, Eye, Split, // Zap, // Sparkles, FileText, Folder, // Plus, // MoreHorizontal } from 'lucide-react'; import { apiClient } from '@/lib/api'; import { toast } from 'sonner'; export interface EnhancedWorkspaceProps { projectId: string; initialFiles?: FileDocument[]; initialFolders?: FolderDocument[]; className?: string; } type PanelView = 'files' | 'ai-generator' | 'prompts' | 'settings'; type LayoutMode = 'default' | 'focus' | 'split' | 'preview'; export function EnhancedWorkspace({ projectId, initialFiles = [], initialFolders = [], className = "" }: EnhancedWorkspaceProps) { const [files, setFiles] = useState(initialFiles); const [folders, setFolders] = useState(initialFolders); const [selectedFileId, setSelectedFileId] = useState(null); const [selectedFile, setSelectedFile] = useState(null); const [leftPanelView, setLeftPanelView] = useState('files'); const [layoutMode, setLayoutMode] = useState('default'); const [isGeneratorOpen, setIsGeneratorOpen] = useState(false); const [isLoading, setIsLoading] = useState(false); const [lastSaved, setLastSaved] = useState(null); const [unsavedChanges, setUnsavedChanges] = useState(0); // Load project data const loadProjectData = useCallback(async () => { setIsLoading(true); try { // Load files and folders const [filesResponse, foldersResponse] = await Promise.all([ apiClient.getFiles(projectId), apiClient.getFolders(projectId, { tree: true }) ]); const filesData = filesResponse.data as { ok?: boolean; files?: FileDocument[] } | FileDocument[]; if (!Array.isArray(filesData)) { if (filesData.ok && filesData.files) { setFiles(filesData.files); } } else { setFiles(filesData); } const foldersData = foldersResponse.data as { ok?: boolean; tree?: FolderDocument[] } | FolderDocument[]; if (!Array.isArray(foldersData)) { if (foldersData.ok && foldersData.tree) { setFolders(foldersData.tree); } } else { setFolders(foldersData); } } catch (error: unknown) { console.error('Error loading project data:', error); const message = (error as { message?: string })?.message || 'Failed to load project data'; toast.error(message); } finally { setIsLoading(false); } }, [projectId]); // Initialize project data useEffect(() => { if (files.length === 0 && folders.length === 0) { loadProjectData(); } }, [loadProjectData, files.length, folders.length]); // Handle file selection const handleFileSelect = useCallback((file: FileDocument) => { setSelectedFileId(file._id); setSelectedFile(file); }, []); // Handle file creation const handleFileCreate = useCallback((file: FileDocument) => { setFiles(prev => [...prev, file]); setSelectedFileId(file._id); setSelectedFile(file); toast.success(`File "${file.name}" created`); }, []); // Handle file update const handleFileUpdate = useCallback((updatedFile: FileDocument) => { setFiles(prev => prev.map(f => f._id === updatedFile._id ? updatedFile : f)); if (selectedFile?._id === updatedFile._id) { setSelectedFile(updatedFile); } setLastSaved(new Date()); }, [selectedFile]); // Handle file deletion const handleFileDelete = useCallback((fileId: string) => { setFiles(prev => prev.filter(f => f._id !== fileId)); if (selectedFileId === fileId) { setSelectedFileId(null); setSelectedFile(null); } toast.success('File deleted'); }, [selectedFileId]); // Handle folder creation const handleFolderCreate = useCallback((folder: FolderDocument) => { setFolders(prev => [...prev, folder]); toast.success(`Folder "${folder.name}" created`); }, []); // Handle project generation const handleProjectGenerated = useCallback((newFiles: FileDocument[], newFolders: FolderDocument[]) => { setFiles(prev => [...prev, ...newFiles]); setFolders(prev => [...prev, ...newFolders]); // Select the first generated file if (newFiles.length > 0) { const firstFile = newFiles[0]; setSelectedFileId(firstFile._id); setSelectedFile(firstFile); } setIsGeneratorOpen(false); toast.success(`Generated ${newFiles.length} files successfully!`); }, []); // Handle prompt selection const handlePromptSelect = useCallback((prompt: string) => { // This would typically be handled by the AI editor component console.log('Selected prompt:', prompt); }, []); // Save all changes const saveAllChanges = useCallback(async () => { try { // This would trigger save on all open tabs toast.success('All changes saved'); setLastSaved(new Date()); setUnsavedChanges(0); } catch { toast.error('Failed to save changes'); } }, []); // Export project const exportProject = useCallback(async () => { try { // Create a zip file with all project files toast.success('Project exported successfully'); } catch { toast.error('Failed to export project'); } }, []); // Get layout classes const getLayoutClasses = () => { switch (layoutMode) { case 'focus': return 'grid-cols-[0px_1fr]'; // Hide sidebar case 'split': return 'grid-cols-[300px_1fr_1fr]'; // Add preview panel case 'preview': return 'grid-cols-[300px_0px_1fr]'; // Hide editor, show preview default: return 'grid-cols-[300px_1fr]'; // Default layout } }; const renderLeftPanel = () => { switch (leftPanelView) { case 'ai-generator': return ( setLeftPanelView('files')} /> ); case 'prompts': return ( ); case 'settings': return (

Settings

Settings panel coming soon...

); default: return ( ); } }; return (
{/* Top Toolbar */}
{/* Panel View Selector */}
{/* Layout Mode Selector */}
{/* Project Status */}
{files.length} files {unsavedChanges > 0 && ( {unsavedChanges} unsaved )} {lastSaved && ( Saved {lastSaved.toLocaleTimeString()} )}
{/* Actions */}
setIsGeneratorOpen(true)}> AI Project Generator Export Project Import Files setLeftPanelView('settings')}> Settings
{/* Main Content */}
{/* Left Panel */} {layoutMode !== 'focus' && ( <> {renderLeftPanel()} )} {/* Editor Panel */} {layoutMode !== 'preview' && ( <>
setLeftPanelView('files')} /> {/* Smart Editor Overlay */} {selectedFile && ( { const updatedFile = { ...selectedFile, content }; setSelectedFile(updatedFile); setUnsavedChanges(prev => prev + 1); }} onSave={() => { // Handle save setUnsavedChanges(prev => Math.max(0, prev - 1)); }} /> )}
{layoutMode === 'split' && } )} {/* Preview Panel */} {(layoutMode === 'split' || layoutMode === 'preview') && (
{selectedFile ? (
{/* Preview content would go here */}

Preview for {selectedFile.name}

Preview functionality coming soon

) : (

Select a file to preview

)}
)}
{/* AI Project Generator Dialog */} setIsGeneratorOpen(false)} />
); }