'use client'; import { useState, useEffect } from 'react'; import Header from '@/components/Header'; import ChatInterface from '@/components/ChatInterface'; import CodeEditor from '@/components/CodeEditor'; import ControlPanel from '@/components/ControlPanel'; import { apiClient } from '@/lib/api'; import { isAuthenticated as checkIsAuthenticated, getStoredToken } from '@/lib/auth'; import type { Message, Language, CodeGenerationRequest } from '@/types'; export default function Home() { const [messages, setMessages] = useState([]); const [generatedCode, setGeneratedCode] = useState(''); const [selectedLanguage, setSelectedLanguage] = useState('html'); const [selectedModel, setSelectedModel] = useState('openrouter/sherlock-dash-alpha'); const [isGenerating, setIsGenerating] = useState(false); const [isAuthenticated, setIsAuthenticated] = useState(false); useEffect(() => { checkAuth(); // Check auth status every second to catch OAuth redirects const interval = setInterval(checkAuth, 1000); return () => clearInterval(interval); }, []); const checkAuth = () => { const authenticated = checkIsAuthenticated(); setIsAuthenticated(authenticated); // Make sure API client has the token if (authenticated) { const token = getStoredToken(); if (token) { apiClient.setToken(token); } } }; const handleSendMessage = async (message: string) => { if (!isAuthenticated) { alert('Please sign in with HuggingFace first! Click the "Sign in with Hugging Face" button in the header.'); return; } // Add user message const userMessage: Message = { role: 'user', content: message, timestamp: new Date().toISOString(), }; setMessages((prev) => [...prev, userMessage]); setIsGenerating(true); // Prepare request const request: CodeGenerationRequest = { query: message, language: selectedLanguage, model_id: selectedModel, provider: 'auto', history: messages.map((m) => [m.role, m.content]), agent_mode: false, }; let generatedCodeBuffer = ''; const assistantMessage: Message = { role: 'assistant', content: '⏳ Generating code...', timestamp: new Date().toISOString(), }; // Add placeholder for assistant message setMessages((prev) => [...prev, assistantMessage]); // Stream the response try { apiClient.generateCodeStream( request, // onChunk - Update code editor in real-time, NOT the chat (chunk: string) => { generatedCodeBuffer += chunk; setGeneratedCode(generatedCodeBuffer); }, // onComplete (code: string) => { setGeneratedCode(code); setIsGenerating(false); // Update final message - just show success, not the code setMessages((prev) => { const newMessages = [...prev]; newMessages[newMessages.length - 1] = { ...assistantMessage, content: '✅ Code generated successfully! Check the editor →', }; return newMessages; }); }, // onError (error: string) => { setIsGenerating(false); setMessages((prev) => { const newMessages = [...prev]; newMessages[newMessages.length - 1] = { ...assistantMessage, content: `❌ Error: ${error}`, }; return newMessages; }); } ); } catch (error) { setIsGenerating(false); setMessages((prev) => { const newMessages = [...prev]; newMessages[newMessages.length - 1] = { ...assistantMessage, content: `❌ Error: ${error instanceof Error ? error.message : 'Unknown error'}`, }; return newMessages; }); } }; const handleDeploy = async () => { if (!generatedCode) { alert('No code to deploy! Generate some code first.'); return; } const spaceName = prompt('Enter HuggingFace Space name (or leave empty for auto-generated):'); if (spaceName === null) return; // User cancelled try { const response = await apiClient.deploy({ code: generatedCode, space_name: spaceName || undefined, language: selectedLanguage, }); if (response.success) { // Open the space URL in a new tab window.open(response.space_url, '_blank'); // Show success message const isDev = response.dev_mode; const message = isDev ? '🚀 Opening HuggingFace Spaces creation page...\nPlease complete the space setup in the new tab.' : `✅ Deployed successfully!\n\nOpening: ${response.space_url}`; alert(message); } else { alert(`Deployment failed: ${response.message}`); } } catch (error) { alert(`Deployment error: ${error instanceof Error ? error.message : 'Unknown error'}`); } }; const handleClear = () => { if (confirm('Clear all messages and code?')) { setMessages([]); setGeneratedCode(''); } }; return (
{/* VS Code layout with Apple styling */}
{/* Left Sidebar - Chat Panel */}
{/* Panel Header */}
Chat
{/* Chat Panel */}
{/* Center - Editor Group */}
{/* Tab Bar */}
{selectedLanguage}.{selectedLanguage === 'html' ? 'html' : selectedLanguage === 'python' ? 'py' : 'js'}
{isGenerating && (
Generating...
)} {selectedLanguage.toUpperCase()}
{/* Editor */}
{/* Right Sidebar - Configuration Panel */}
{/* Status Bar - Apple style */}
); }