import React from 'react'; import { Card } from '../../ui/card'; import { Button } from '../../ui/button'; import { Input } from '../../ui/input'; import { FullExtensionConfig } from '../../../extensions'; import { getApiUrl, getSecretKey } from '../../../config'; import { addExtension } from '../../../extensions'; import { toastError, toastSuccess } from '../../../toasts'; interface ConfigureExtensionModalProps { isOpen: boolean; onClose: () => void; onSubmit: () => void; onRemove: () => void; extension: FullExtensionConfig | null; } export function ConfigureExtensionModal({ isOpen, onClose, onSubmit, onRemove, extension, }: ConfigureExtensionModalProps) { const [envValues, setEnvValues] = React.useState>({}); const [isSubmitting, setIsSubmitting] = React.useState(false); // Reset form when dialog closes or extension changes React.useEffect(() => { if (!isOpen || !extension) { setEnvValues({}); } }, [isOpen, extension]); const handleExtensionConfigSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!extension) return; setIsSubmitting(true); try { // First store all environment variables if (extension.env_keys && extension.env_keys.length > 0) { for (const envKey of extension.env_keys) { const value = envValues[envKey]; if (!value) continue; const storeResponse = await fetch(getApiUrl('/configs/store'), { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Secret-Key': getSecretKey(), }, body: JSON.stringify({ key: envKey, value: value.trim(), isSecret: true, }), }); if (!storeResponse.ok) { throw new Error(`Failed to store environment variable: ${envKey}`); } } } const response = await addExtension(extension); if (!response.ok) { throw new Error('Failed to add system configuration'); } toastSuccess({ title: extension.name, msg: `Successfully configured extension`, }); onSubmit(); onClose(); } catch (err) { console.error('Error configuring extension:', err); const errorMessage = err instanceof Error ? err.message : 'Unknown error occurred'; toastError({ title: extension.name, msg: `Failed to configure extension`, traceback: errorMessage, }); } finally { setIsSubmitting(false); } }; if (!extension || !isOpen) return null; return (
{/* Header */}

Configure {extension.name}

{/* Form */}
{extension.env_keys && extension.env_keys.length > 0 ? ( <>

Please provide the required environment variables for this extension:

{extension.env_keys.map((envVarName) => (
setEnvValues((prev) => ({ ...prev, [envVarName]: e.target.value, })) } className="w-full h-14 px-4 font-regular rounded-lg border shadow-none border-gray-300 bg-white text-lg placeholder:text-gray-400 font-regular text-gray-900 dark:bg-gray-800 dark:border-gray-600 dark:text-white dark:placeholder:text-gray-500" required />
))}
) : (

This extension doesn't require any environment variables.

)}
{/* Actions */}
); }