import React, { useState, useEffect } from "react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Loader2 } from "lucide-react"; import { useCustomLanguageModelProvider } from "@/hooks/useCustomLanguageModelProvider"; import type { LanguageModelProvider } from "@/ipc/ipc_types"; interface CreateCustomProviderDialogProps { isOpen: boolean; onClose: () => void; onSuccess: () => void; editingProvider?: LanguageModelProvider | null; } export function CreateCustomProviderDialog({ isOpen, onClose, onSuccess, editingProvider = null, }: CreateCustomProviderDialogProps) { const [id, setId] = useState(""); const [name, setName] = useState(""); const [apiBaseUrl, setApiBaseUrl] = useState(""); const [envVarName, setEnvVarName] = useState(""); const [errorMessage, setErrorMessage] = useState(""); const isEditMode = Boolean(editingProvider); const { createProvider, editProvider, isCreating, isEditing, error } = useCustomLanguageModelProvider(); // Load provider data when editing useEffect(() => { if (editingProvider && isOpen) { const cleanId = editingProvider.id?.startsWith("custom::") ? editingProvider.id.replace("custom::", "") : editingProvider.id || ""; setId(cleanId); setName(editingProvider.name || ""); setApiBaseUrl(editingProvider.apiBaseUrl || ""); setEnvVarName(editingProvider.envVarName || ""); } else if (!isOpen) { // Reset form when dialog closes setId(""); setName(""); setApiBaseUrl(""); setEnvVarName(""); setErrorMessage(""); } }, [editingProvider, isOpen]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setErrorMessage(""); try { if (isEditMode && editingProvider) { const cleanId = editingProvider.id?.startsWith("custom::") ? editingProvider.id.replace("custom::", "") : editingProvider.id || ""; await editProvider({ id: cleanId, name: name.trim(), apiBaseUrl: apiBaseUrl.trim(), envVarName: envVarName.trim() || undefined, }); } else { await createProvider({ id: id.trim(), name: name.trim(), apiBaseUrl: apiBaseUrl.trim(), envVarName: envVarName.trim() || undefined, }); } // Reset form setId(""); setName(""); setApiBaseUrl(""); setEnvVarName(""); onSuccess(); } catch (error) { setErrorMessage( error instanceof Error ? error.message : `Failed to ${isEditMode ? "edit" : "create"} custom provider`, ); } }; const handleClose = () => { if (!isCreating && !isEditing) { setErrorMessage(""); onClose(); } }; const isLoading = isCreating || isEditing; return ( {isEditMode ? "Edit Custom Provider" : "Add Custom Provider"} {isEditMode ? "Update your custom language model provider configuration." : "Connect to a custom language model provider API."}
setId(e.target.value)} placeholder="E.g., my-provider" required disabled={isLoading || isEditMode} />

A unique identifier for this provider (no spaces).

setName(e.target.value)} placeholder="E.g., My Provider" required disabled={isLoading} />

The name that will be displayed in the UI.

setApiBaseUrl(e.target.value)} placeholder="E.g., https://api.example.com/v1" required disabled={isLoading} />

The base URL for the API endpoint.

setEnvVarName(e.target.value)} placeholder="E.g., MY_PROVIDER_API_KEY" disabled={isLoading} />

Environment variable name for the API key.

{(errorMessage || error) && (
{errorMessage || (error instanceof Error ? error.message : "Failed to create custom provider")}
)}
); }