import { useEffect, useState } from 'react'; import type { FormEvent } from 'react'; import { X } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { Button, Input } from '../../../../shared/view/ui'; import { DEFAULT_CODEX_MCP_FORM } from '../../constants/constants'; import type { CodexMcpFormState, McpServer } from '../../types/types'; type CodexMcpFormModalProps = { isOpen: boolean; editingServer: McpServer | null; onClose: () => void; onSubmit: (formData: CodexMcpFormState, editingServer: McpServer | null) => Promise; }; const getErrorMessage = (error: unknown): string => ( error instanceof Error ? error.message : 'Unknown error' ); const createFormStateFromServer = (server: McpServer): CodexMcpFormState => ({ name: server.name || '', type: 'stdio', config: { command: server.config?.command || '', args: server.config?.args || [], env: server.config?.env || {}, }, }); export default function CodexMcpFormModal({ isOpen, editingServer, onClose, onSubmit, }: CodexMcpFormModalProps) { const { t } = useTranslation('settings'); const [formData, setFormData] = useState(DEFAULT_CODEX_MCP_FORM); const [isSubmitting, setIsSubmitting] = useState(false); useEffect(() => { if (!isOpen) { return; } if (editingServer) { setFormData(createFormStateFromServer(editingServer)); return; } setFormData(DEFAULT_CODEX_MCP_FORM); }, [editingServer, isOpen]); if (!isOpen) { return null; } const handleSubmit = async (event: FormEvent) => { event.preventDefault(); setIsSubmitting(true); try { await onSubmit(formData, editingServer); } catch (error) { alert(`Error: ${getErrorMessage(error)}`); } finally { setIsSubmitting(false); } }; return (

{editingServer ? t('mcpForm.title.edit') : t('mcpForm.title.add')}

setFormData((prev) => ({ ...prev, name: event.target.value }))} placeholder={t('mcpForm.placeholders.serverName')} required />
{ const command = event.target.value; setFormData((prev) => ({ ...prev, config: { ...prev.config, command }, })); }} placeholder="npx @my-org/mcp-server" required />