"use client";
import { useState, useEffect } from "react";
import PropTypes from "prop-types";
import { Modal, Input, Button, Badge } from "@/shared/components";
const DEFAULT_BASE_URL = "https://api.openai.com/v1";
// Dual-mode modal: edit when `node` provided, add otherwise
export default function AddCustomEmbeddingModal({ isOpen, onClose, onCreated, onSaved, node }) {
const isEdit = !!node;
const [formData, setFormData] = useState({
name: "",
prefix: "",
baseUrl: DEFAULT_BASE_URL,
});
const [submitting, setSubmitting] = useState(false);
const [checkKey, setCheckKey] = useState("");
const [checkModelId, setCheckModelId] = useState("");
const [validating, setValidating] = useState(false);
const [validationResult, setValidationResult] = useState(null);
useEffect(() => {
if (!isOpen) return;
setValidationResult(null);
setCheckKey("");
setCheckModelId("");
if (isEdit) {
setFormData({
name: node.name || "",
prefix: node.prefix || "",
baseUrl: node.baseUrl || DEFAULT_BASE_URL,
});
} else {
setFormData({ name: "", prefix: "", baseUrl: DEFAULT_BASE_URL });
}
}, [isOpen, isEdit, node]);
const handleSubmit = async () => {
if (!formData.name.trim() || !formData.prefix.trim() || !formData.baseUrl.trim()) return;
setSubmitting(true);
try {
const url = isEdit ? `/api/provider-nodes/${node.id}` : "/api/provider-nodes";
const method = isEdit ? "PUT" : "POST";
const payload = {
name: formData.name,
prefix: formData.prefix,
baseUrl: formData.baseUrl,
};
if (!isEdit) payload.type = "custom-embedding";
const res = await fetch(url, {
method,
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload),
});
const data = await res.json();
if (res.ok) {
if (isEdit) onSaved?.(data.node);
else onCreated?.(data.node);
}
} catch (error) {
console.log("Error saving custom embedding node:", error);
} finally {
setSubmitting(false);
}
};
const handleValidate = async () => {
setValidating(true);
try {
const res = await fetch("/api/provider-nodes/validate", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
baseUrl: formData.baseUrl,
apiKey: checkKey,
type: "custom-embedding",
modelId: checkModelId.trim() || undefined,
}),
});
const data = await res.json();
setValidationResult(data);
} catch {
setValidationResult({ valid: false, error: "Network error" });
} finally {
setValidating(false);
}
};
const renderValidationResult = () => {
if (!validationResult) return null;
const { valid, error, dimensions } = validationResult;
if (valid) {
return (
<>