"use client"; import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import useStore from "@/lib/store"; import modelAdapter from "@/lib/services/adapter-instance"; import { Save, Key, Server, Eye, EyeOff } from "lucide-react"; export default function SettingsPanel() { const { apiKeys, setApiKey, selectedProvider, setSelectedProvider, qwenTokens, setQwenTokens } = useStore(); const [showApiKey, setShowApiKey] = useState>({}); const [isAuthLoading, setIsAuthLoading] = useState(false); const handleSave = () => { if (typeof window !== "undefined") { localStorage.setItem("promptarch-api-keys", JSON.stringify(apiKeys)); alert("API keys saved successfully!"); } }; const handleLoad = () => { if (typeof window !== "undefined") { const saved = localStorage.getItem("promptarch-api-keys"); if (saved) { try { const keys = JSON.parse(saved); if (keys.qwen) { setApiKey("qwen", keys.qwen); modelAdapter.updateQwenApiKey(keys.qwen); } if (keys.ollama) { setApiKey("ollama", keys.ollama); modelAdapter.updateOllamaApiKey(keys.ollama); } if (keys.zai) { setApiKey("zai", keys.zai); modelAdapter.updateZaiApiKey(keys.zai); } } catch (e) { console.error("Failed to load API keys:", e); } } const storedTokens = modelAdapter.getQwenTokenInfo(); if (storedTokens) { setQwenTokens(storedTokens); } } }; const handleApiKeyChange = (provider: string, value: string) => { setApiKey(provider as "qwen" | "ollama" | "zai", value); switch (provider) { case "qwen": modelAdapter.updateQwenApiKey(value); break; case "ollama": modelAdapter.updateOllamaApiKey(value); break; case "zai": modelAdapter.updateZaiApiKey(value); break; } }; const handleQwenAuth = async () => { if (qwenTokens) { setQwenTokens(null); modelAdapter.updateQwenTokens(); modelAdapter.updateQwenApiKey(apiKeys.qwen || ""); return; } setIsAuthLoading(true); try { const token = await modelAdapter.startQwenOAuth(); setQwenTokens(token); modelAdapter.updateQwenTokens(token); } catch (error) { console.error("Qwen OAuth failed", error); window.alert( error instanceof Error ? error.message : "Qwen authentication failed" ); } finally { setIsAuthLoading(false); } }; useEffect(() => { handleLoad(); }, []); return (
API Configuration Configure API keys for different AI providers
handleApiKeyChange("qwen", e.target.value)} className="font-mono text-xs lg:text-sm pr-10" />

Get API key from{" "} Alibaba DashScope

{qwenTokens && (

✓ Authenticated via OAuth (Expires: {new Date(qwenTokens.expiresAt || 0).toLocaleString()})

)}
handleApiKeyChange("ollama", e.target.value)} className="font-mono text-xs lg:text-sm pr-10" />

Get API key from{" "} ollama.com/cloud

handleApiKeyChange("zai", e.target.value)} className="font-mono text-xs lg:text-sm pr-10" />

Get API key from{" "} docs.z.ai

Default Provider Select your preferred AI provider
{(["qwen", "ollama", "zai"] as const).map((provider) => ( ))}
Data Privacy Your data handling preferences

All API keys are stored locally in your browser. Your prompts are sent directly to the selected AI provider and are not stored by PromptArch.

); }