import React, { useMemo } from 'react'; import { KeyRound, PlugZap, AlertTriangle } from 'lucide-react'; import { Spinner, OGDialog, OGDialogTitle, OGDialogHeader, OGDialogContent, } from '@librechat/client'; import type { MCPServerStatus } from 'librechat-data-provider'; import type { ConfigFieldDetail } from '~/common'; import ServerInitializationSection from './ServerInitializationSection'; import CustomUserVarsSection from './CustomUserVarsSection'; import { useLocalize } from '~/hooks'; interface MCPConfigDialogProps { isOpen: boolean; onOpenChange: (isOpen: boolean) => void; fieldsSchema: Record; initialValues: Record; onSave: (updatedValues: Record) => void; isSubmitting?: boolean; onRevoke?: () => void; serverName: string; serverStatus?: MCPServerStatus; conversationId?: string | null; } export default function MCPConfigDialog({ isOpen, onOpenChange, fieldsSchema, onSave, isSubmitting = false, onRevoke, serverName, serverStatus, conversationId, }: MCPConfigDialogProps) { const localize = useLocalize(); const hasFields = Object.keys(fieldsSchema).length > 0; const dialogTitle = hasFields ? localize('com_ui_configure_mcp_variables_for', { 0: serverName }) : `${serverName} MCP Server`; const fullTitle = useMemo(() => { if (!serverStatus) { return localize('com_ui_mcp_dialog_title', { serverName, status: '', }); } const { connectionState, requiresOAuth } = serverStatus; let statusText = ''; if (connectionState === 'connecting') { statusText = localize('com_ui_connecting'); } else if (connectionState === 'error') { statusText = localize('com_ui_error'); } else if (connectionState === 'connected') { statusText = localize('com_ui_active'); } else if (connectionState === 'disconnected') { statusText = requiresOAuth ? localize('com_ui_oauth') : localize('com_ui_offline'); } return localize('com_ui_mcp_dialog_title', { serverName, status: statusText, }); }, [serverStatus, serverName, localize]); // Helper function to render status badge based on connection state const renderStatusBadge = () => { if (!serverStatus) { return null; } const { connectionState, requiresOAuth } = serverStatus; if (connectionState === 'connecting') { return (
{localize('com_ui_connecting')}
); } if (connectionState === 'disconnected') { if (requiresOAuth) { return (
); } else { return (
); } } if (connectionState === 'error') { return (
); } if (connectionState === 'connected') { return (
{localize('com_ui_active')}
); } return null; }; return (
{dialogTitle.charAt(0).toUpperCase() + dialogTitle.slice(1)} {renderStatusBadge()}
{/* Custom User Variables Section */} {})} isSubmitting={isSubmitting} /> {/* Server Initialization Section */} 0} />
); }