import React, { useState, useEffect } from 'react'; import { FileText, Settings, Bot, Terminal, Play, Save, FolderOpen } from 'lucide-react'; // Backend URLs const BACKEND_URL = import.meta.env.VITE_BACKEND_URL || 'https://cursor-backend.workers.dev'; function App() { const [selectedFile, setSelectedFile] = useState(null); const [files, setFiles] = useState([]); const [content, setContent] = useState(''); const [isConnected, setIsConnected] = useState(false); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [showChat, setShowChat] = useState(false); const [showSettings, setShowSettings] = useState(false); const [apiKey, setApiKey] = useState(''); const [chatMessage, setChatMessage] = useState(''); const [chatHistory, setChatHistory] = useState([]); useEffect(() => { initializeApp(); }, []); const initializeApp = async () => { try { setIsLoading(true); setError(null); // Test backend connection const healthResponse = await fetch(`${BACKEND_URL}/health`); if (healthResponse.ok) { const healthData = await healthResponse.json(); console.log('Backend connected:', healthData); setIsConnected(true); // Load workspace files await loadWorkspaceFiles(); } else { throw new Error('Backend not responding'); } } catch (error) { console.error('Failed to connect to backend:', error); setError('Failed to connect to backend. Please check your connection.'); } finally { setIsLoading(false); } }; const loadWorkspaceFiles = async () => { try { const response = await fetch(`${BACKEND_URL}/api/workspace/files`); if (response.ok) { const data = await response.json(); setFiles(data.files || []); console.log('Loaded files:', data.files); } else { throw new Error('Failed to load files'); } } catch (error) { console.error('Failed to load workspace files:', error); } }; const loadFileContent = async (filePath: string) => { try { const response = await fetch(`${BACKEND_URL}/api/workspace/file/${filePath}`); if (response.ok) { const data = await response.json(); setContent(data.content || ''); setSelectedFile(filePath); } else { throw new Error('Failed to load file'); } } catch (error) { console.error('Failed to load file:', error); setContent('// Error loading file'); } }; const saveFile = async () => { if (!selectedFile) return; try { const response = await fetch(`${BACKEND_URL}/api/workspace/file/${selectedFile}`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ content }), }); if (response.ok) { console.log('File saved successfully'); } else { throw new Error('Failed to save file'); } } catch (error) { console.error('Failed to save file:', error); } }; const runCode = async () => { if (!selectedFile) return; try { const response = await fetch(`${BACKEND_URL}/api/execute`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ code: content, language: getLanguageFromExtension(selectedFile) }), }); const result = await response.json(); console.log('Code executed:', result); } catch (error) { console.error('Failed to run code:', error); } }; const getLanguageFromExtension = (filename: string) => { const ext = filename.split('.').pop()?.toLowerCase(); const languageMap: Record = { 'js': 'javascript', 'jsx': 'javascript', 'ts': 'typescript', 'tsx': 'typescript', 'py': 'python', 'java': 'java', 'cpp': 'cpp', 'c': 'c', 'html': 'html', 'css': 'css', 'json': 'json', 'md': 'markdown', }; return languageMap[ext || ''] || 'plaintext'; }; const sendChatMessage = async () => { if (!chatMessage.trim() || !apiKey) return; const userMessage = { id: Date.now().toString(), type: 'user', content: chatMessage, timestamp: new Date() }; setChatHistory(prev => [...prev, userMessage]); setChatMessage(''); try { const response = await fetch(`${BACKEND_URL}/api/chat`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ message: chatMessage, provider: 'openai', apiKey: apiKey, model: 'gpt-4' }), }); const data = await response.json(); const assistantMessage = { id: Date.now().toString(), type: 'assistant', content: data.response || 'No response received', timestamp: new Date() }; setChatHistory(prev => [...prev, assistantMessage]); } catch (error) { console.error('Failed to send chat message:', error); const errorMessage = { id: Date.now().toString(), type: 'assistant', content: 'Failed to send message. Please check your connection.', timestamp: new Date() }; setChatHistory(prev => [...prev, errorMessage]); } }; if (isLoading) { return (
Loading Cursor AI IDE...
); } if (error) { return (
⚠️
{error}
); } return (
{/* Sidebar */}
{/* Header */}
Cursor AI IDE
{isConnected ? 'Connected' : 'Disconnected'}
{/* Files */}
Files
{files.map((file, index) => (
loadFileContent(file.path)} >
{file.name}
))}
{/* Actions */}
{/* Main Content */}
{/* Editor Header */} {selectedFile && (
{selectedFile} {getLanguageFromExtension(selectedFile)}
)} {/* Editor */}
{selectedFile ? (