"use client"; import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Textarea } from "@/components/ui/textarea"; import useStore from "@/lib/store"; import modelAdapter from "@/lib/services/adapter-instance"; import { Sparkles, Copy, RefreshCw, Loader2, CheckCircle2, Settings } from "lucide-react"; import { cn } from "@/lib/utils"; import { translations } from "@/lib/i18n/translations"; export default function PromptEnhancer() { const { language, currentPrompt, enhancedPrompt, selectedProvider, selectedModels, availableModels, apiKeys, isProcessing, error, setSelectedProvider, setCurrentPrompt, setEnhancedPrompt, setProcessing, setError, setAvailableModels, setSelectedModel, } = useStore(); const t = translations[language].promptEnhancer; const common = translations[language].common; const [copied, setCopied] = useState(false); const selectedModel = selectedModels[selectedProvider]; const models = availableModels[selectedProvider] || modelAdapter.getAvailableModels(selectedProvider); useEffect(() => { if (typeof window !== "undefined") { loadAvailableModels(); const saved = localStorage.getItem("promptarch-api-keys"); if (saved) { try { const keys = JSON.parse(saved); if (keys.qwen) modelAdapter.updateQwenApiKey(keys.qwen); if (keys.ollama) modelAdapter.updateOllamaApiKey(keys.ollama); if (keys.zai) modelAdapter.updateZaiApiKey(keys.zai); } catch (e) { console.error("Failed to load API keys:", e); } } } }, [selectedProvider]); const loadAvailableModels = async () => { const fallbackModels = modelAdapter.getAvailableModels(selectedProvider); setAvailableModels(selectedProvider, fallbackModels); try { const result = await modelAdapter.listModels(selectedProvider); if (result.success && result.data) { setAvailableModels(selectedProvider, result.data[selectedProvider] || fallbackModels); } } catch (error) { console.error("Failed to load models:", error); } }; const handleEnhance = async () => { if (!currentPrompt.trim()) { setError(t.enterPromptError); return; } const apiKey = apiKeys[selectedProvider]; const isQwenOAuth = selectedProvider === "qwen" && modelAdapter.hasQwenAuth(); if (!isQwenOAuth && (!apiKey || !apiKey.trim())) { setError(`${common.error}: ${common.configApiKey}`); return; } setProcessing(true); setError(null); console.log("[PromptEnhancer] Starting enhancement...", { selectedProvider, selectedModel, hasQwenAuth: modelAdapter.hasQwenAuth() }); try { const result = await modelAdapter.enhancePrompt(currentPrompt, selectedProvider, selectedModel); console.log("[PromptEnhancer] Enhancement result:", result); if (result.success && result.data) { setEnhancedPrompt(result.data); } else { console.error("[PromptEnhancer] Enhancement failed:", result.error); setError(result.error || t.errorEnhance); } } catch (err) { console.error("[PromptEnhancer] Enhancement error:", err); setError(err instanceof Error ? err.message : t.errorEnhance); } finally { setProcessing(false); } }; const handleCopy = async () => { if (enhancedPrompt) { await navigator.clipboard.writeText(enhancedPrompt); setCopied(true); setTimeout(() => setCopied(false), 2000); } }; const handleClear = () => { setCurrentPrompt(""); setEnhancedPrompt(null); setError(null); }; return (
{t.title} {t.description}
{(["qwen", "ollama", "zai"] as const).map((provider) => ( ))}