import { useAIStore } from '../store/aiStore'; import { useState, useEffect } from 'react'; import type { AIProvider } from '../types/project'; import { useEditorStore } from '../store/editorStore'; import { Bot, Cloud, Brain, RefreshCw } from 'lucide-react'; export default function SettingsPanel() { const { providers, defaultProvider, setProviderConfig, setDefaultProvider } = useAIStore(); const { backendUrl } = useEditorStore(); const [ollamaModels, setOllamaModels] = useState([]); const [loadingModels, setLoadingModels] = useState(false); const fetchOllamaModels = async () => { setLoadingModels(true); try { const res = await fetch(`${backendUrl}/ai/ollama-models`); if (res.ok) { const data = await res.json(); setOllamaModels(data.models || []); } } catch { setOllamaModels([]); } finally { setLoadingModels(false); } }; useEffect(() => { fetchOllamaModels(); }, [backendUrl]); const providerIcons: Record = { ollama: , openai: , claude: , }; const providerLabels: Record = { ollama: 'Ollama (Local)', openai: 'OpenAI', claude: 'Claude (Anthropic)', }; return (

AI Settings

{/* Default provider selector */}
{(['ollama', 'openai', 'claude'] as AIProvider[]).map((p) => ( ))}
{/* Ollama settings */} setProviderConfig('ollama', { baseUrl: v })} placeholder="http://localhost:11434" />
{ollamaModels.length > 0 ? ( ) : ( setProviderConfig('ollama', { model: v })} placeholder="llama3" /> )}
{/* OpenAI settings */} setProviderConfig('openai', { apiKey: v })} placeholder="sk-..." type="password" /> setProviderConfig('openai', { model: v })} placeholder="gpt-4o" /> {/* Claude settings */} setProviderConfig('claude', { apiKey: v })} placeholder="sk-ant-..." type="password" /> setProviderConfig('claude', { model: v })} placeholder="claude-sonnet-4-20250514" />
); } function ProviderSection({ title, icon, children, }: { title: string; icon: React.ReactNode; children: React.ReactNode; }) { return (
{icon} {title}
{children}
); } function InputField({ label, value, onChange, placeholder, type = 'text', }: { label: string; value: string; onChange: (value: string) => void; placeholder: string; type?: string; }) { return (
{label && } onChange(e.target.value)} placeholder={placeholder} className="w-full px-3 py-2 bg-editor-bg border border-editor-border rounded-lg text-xs text-editor-text placeholder:text-editor-text-muted/50 focus:outline-none focus:border-editor-accent" />
); }