'use client'; import { useState, useEffect, useRef } from 'react'; import { apiClient } from '@/lib/api'; import type { Model, Language } from '@/types'; interface LandingPageProps { onStart: (prompt: string, language: Language, modelId: string) => void; isAuthenticated: boolean; initialLanguage?: Language; initialModel?: string; } export default function LandingPage({ onStart, isAuthenticated, initialLanguage = 'html', initialModel = 'gemini-3.0-pro' }: LandingPageProps) { const [prompt, setPrompt] = useState(''); const [selectedLanguage, setSelectedLanguage] = useState(initialLanguage); const [selectedModel, setSelectedModel] = useState(initialModel); const [models, setModels] = useState([]); const [languages, setLanguages] = useState([]); const [isLoading, setIsLoading] = useState(true); // Dropdown states const [showLanguageDropdown, setShowLanguageDropdown] = useState(false); const [showModelDropdown, setShowModelDropdown] = useState(false); const languageDropdownRef = useRef(null); const modelDropdownRef = useRef(null); useEffect(() => { loadData(); }, []); // Close dropdowns when clicking outside useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (languageDropdownRef.current && !languageDropdownRef.current.contains(event.target as Node)) { setShowLanguageDropdown(false); } if (modelDropdownRef.current && !modelDropdownRef.current.contains(event.target as Node)) { setShowModelDropdown(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, []); const loadData = async () => { setIsLoading(true); await Promise.all([loadModels(), loadLanguages()]); setIsLoading(false); }; const loadModels = async () => { try { const modelsList = await apiClient.getModels(); setModels(modelsList); } catch (error) { console.error('Failed to load models:', error); } }; const loadLanguages = async () => { try { const { languages: languagesList } = await apiClient.getLanguages(); setLanguages(languagesList); } catch (error) { console.error('Failed to load languages:', error); } }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (prompt.trim() && isAuthenticated) { onStart(prompt.trim(), selectedLanguage, selectedModel); } else if (!isAuthenticated) { alert('Please sign in with HuggingFace first!'); } }; const formatLanguageName = (lang: Language) => { if (lang === 'html') return 'HTML'; if (lang === 'transformers.js') return 'Transformers.js'; return lang.charAt(0).toUpperCase() + lang.slice(1); }; return (
{/* Header - Minimal Apple style */}

AnyCoder

{/* Main Content - Centered with generous Apple spacing */}
{/* Headline - Apple typography with VS Code colors */}

Build with AnyCoder

Create apps and websites by chatting with AI

{/* Prompt Input - VS Code style with Apple polish */}
{/* Options Row - Language and Model dropdowns */}
{/* Language Dropdown */}
{/* Language Dropdown Tray */} {showLanguageDropdown && !isLoading && languages.length > 0 && (
{languages.map((lang) => ( ))}
)}
{/* Model Dropdown */}
{/* Model Dropdown Tray */} {showModelDropdown && !isLoading && models.length > 0 && (
{models.map((model) => ( ))}
)}
{/* Textarea */}