"use client"; import { useState, useEffect } from "react"; import PropTypes from "prop-types"; import { Button, Modal } from "@/shared/components"; export default function AddCustomModelModal({ isOpen, providerAlias, providerDisplayAlias, onSave, onClose }) { const [modelId, setModelId] = useState(""); const [testStatus, setTestStatus] = useState(null); // null | "testing" | "ok" | "error" const [testError, setTestError] = useState(""); const [saving, setSaving] = useState(false); // Reset state when modal opens useEffect(() => { if (isOpen) { setModelId(""); setTestStatus(null); setTestError(""); } }, [isOpen]); const handleTest = async () => { if (!modelId.trim()) return; setTestStatus("testing"); setTestError(""); try { const res = await fetch("/api/models/test", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ model: `${providerAlias}/${modelId.trim()}` }), }); const data = await res.json(); setTestStatus(data.ok ? "ok" : "error"); setTestError(data.error || ""); } catch (err) { setTestStatus("error"); setTestError(err.message); } }; const handleSave = async () => { if (!modelId.trim() || saving) return; setSaving(true); try { await onSave(modelId.trim()); } finally { setSaving(false); } }; const handleKeyDown = (e) => { if (e.key === "Enter") handleTest(); }; return (
{ setModelId(e.target.value); setTestStatus(null); setTestError(""); }} onKeyDown={handleKeyDown} placeholder="e.g. claude-opus-4-5" className="flex-1 px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary" autoFocus />

Sent to provider as: {modelId.trim() || "model-id"}

{/* Test result */} {testStatus === "ok" && (
check_circle Model is reachable
)} {testStatus === "error" && (
cancel {testError || "Model not reachable"}
)}
); } AddCustomModelModal.propTypes = { isOpen: PropTypes.bool.isRequired, providerAlias: PropTypes.string.isRequired, providerDisplayAlias: PropTypes.string.isRequired, onSave: PropTypes.func.isRequired, onClose: PropTypes.func.isRequired, };