"use client" import { useCallback, useEffect, useState } from "react" import { Loader2 } from "lucide-react" import { useTranslations } from "next-intl" import { toast } from "sonner" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { updateModelProvider } from "@/lib/api" import { MODEL_PROVIDER_AGENT_TYPES, AGENT_LABELS, type AgentType, type ModelProviderInfo, } from "@/lib/types" interface EditModelProviderDialogProps { provider: ModelProviderInfo | null onOpenChange: (open: boolean) => void onProviderUpdated: () => void } export function EditModelProviderDialog({ provider, onOpenChange, onProviderUpdated, }: EditModelProviderDialogProps) { const t = useTranslations("ModelProviderSettings") const [loading, setLoading] = useState(false) const [error, setError] = useState(null) const [name, setName] = useState("") const [apiUrl, setApiUrl] = useState("") const [apiKey, setApiKey] = useState("") const [selectedTypes, setSelectedTypes] = useState([]) useEffect(() => { if (provider) { setName(provider.name) setApiUrl(provider.api_url) setApiKey("") setSelectedTypes([...provider.agent_types]) setError(null) } }, [provider]) const handleOpenChange = useCallback( (nextOpen: boolean) => { if (!nextOpen) setError(null) onOpenChange(nextOpen) }, [onOpenChange] ) const toggleAgentType = useCallback((at: AgentType) => { setSelectedTypes((prev) => prev.includes(at) ? prev.filter((t) => t !== at) : [...prev, at] ) }, []) const handleSubmit = useCallback(async () => { if (!provider) return if (!name.trim()) { setError(t("nameRequired")) return } if (!apiUrl.trim()) { setError(t("apiUrlRequired")) return } if (selectedTypes.length === 0) { setError(t("agentTypesRequired")) return } setLoading(true) setError(null) try { await updateModelProvider({ id: provider.id, name: name.trim() !== provider.name ? name.trim() : undefined, apiUrl: apiUrl.trim() !== provider.api_url ? apiUrl.trim() : undefined, apiKey: apiKey.trim() || undefined, agentTypes: JSON.stringify(selectedTypes) !== JSON.stringify(provider.agent_types) ? selectedTypes : undefined, }) toast.success(t("editSuccess")) handleOpenChange(false) onProviderUpdated() } catch (err: unknown) { const raw = err as Record const msg = typeof raw?.message === "string" ? raw.message : err instanceof Error ? err.message : String(err) setError(msg) } finally { setLoading(false) } }, [ provider, name, apiUrl, apiKey, selectedTypes, handleOpenChange, onProviderUpdated, t, ]) return ( {t("editProvider")}
setName(e.target.value)} placeholder={t("providerNamePlaceholder")} />
setApiUrl(e.target.value)} placeholder={t("apiUrlPlaceholder")} />
setApiKey(e.target.value)} placeholder={t("apiKeyKeepCurrent")} />
{MODEL_PROVIDER_AGENT_TYPES.map((at) => ( ))}
{error && (
{error}
)}
) }