import { useEffect, useState } from "react"; import { Link, useNavigate } from "react-router-dom"; import { ArrowLeft, Eye, EyeOff, Loader2, Save, Plug } from "lucide-react"; import { ThemeToggle } from "../components/ThemeToggle"; import { useToast } from "../lib/toast"; import { getConfigDisplay, setConfig, testConnection } from "../lib/llm"; const DEFAULTS = { api_endpoint: "", api_key: "", model_name: "MiniMax-M3", }; export function SettingsPage() { const toast = useToast(); const navigate = useNavigate(); const [endpoint, setEndpoint] = useState(DEFAULTS.api_endpoint); const [model, setModel] = useState(DEFAULTS.model_name); const [apiKey, setApiKey] = useState(""); // never pre-populated from storage const [apiKeySet, setApiKeySet] = useState(false); const [showKey, setShowKey] = useState(false); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [testing, setTesting] = useState(false); // Load current (non-secret) values on mount. useEffect(() => { const cfg = getConfigDisplay(); setEndpoint(cfg.api_endpoint); setModel(cfg.model_name); setApiKeySet(cfg.api_key_set); setLoading(false); }, []); const onSave = async (e: React.FormEvent) => { e.preventDefault(); setSaving(true); try { const result = setConfig({ api_endpoint: endpoint.trim(), api_key: apiKey, model_name: model.trim(), }); setApiKey(""); setApiKeySet(result.api_key_set); toast.success("Configuration saved"); } catch (err) { toast.error( err instanceof Error ? err.message : "Failed to save configuration", ); } finally { setSaving(false); } }; const onTest = async () => { setTesting(true); // Persist current form values first so the test reflects them. setConfig // preserves the existing key when the field is empty, so this is safe. try { const result = setConfig({ api_endpoint: endpoint.trim(), api_key: apiKey, model_name: model.trim(), }); setApiKey(""); setApiKeySet(result.api_key_set); } catch (err) { setTesting(false); toast.error( err instanceof Error ? err.message : "Failed to save configuration", ); return; } const result = await testConnection(); if (result.success) { toast.success(`✅ ${result.message}`); } else { toast.error(`❌ ${result.message}`); } setTesting(false); }; return (

API Configuration

{loading ? (
) : (
setEndpoint(e.target.value)} required />
setApiKey(e.target.value)} autoComplete="off" spellCheck={false} />
{apiKeySet && !apiKey && (

A key is currently saved.

)}
setModel(e.target.value)} required />
)}

Your settings are stored in this browser's local storage. Do not use this app on a device that other people have access to.

← Back to generator
); }