import React, { useState } from 'react'; import { Label, OGDialog, TrashIcon, OGDialogTrigger, OGDialogTemplate } from '@librechat/client'; import type { MCPServerInfo } from '~/common'; import { useLocalize, useMCPServerManager, useRemoveMCPTool } from '~/hooks'; import MCPServerStatusIcon from '~/components/MCP/MCPServerStatusIcon'; import MCPConfigDialog from '~/components/MCP/MCPConfigDialog'; import { cn } from '~/utils'; export default function UninitializedMCPTool({ serverInfo }: { serverInfo?: MCPServerInfo }) { const localize = useLocalize(); const { removeTool } = useRemoveMCPTool(); const [isFocused, setIsFocused] = useState(false); const [isHovering, setIsHovering] = useState(false); const { initializeServer, isInitializing, getServerStatusIconProps, getConfigDialogProps } = useMCPServerManager(); if (!serverInfo) { return null; } const serverName = serverInfo.serverName; const isServerInitializing = isInitializing(serverName); const statusIconProps = getServerStatusIconProps(serverName); const configDialogProps = getConfigDialogProps(); const statusIcon = statusIconProps && (
{ e.stopPropagation(); }} className="cursor-pointer rounded p-0.5 hover:bg-surface-secondary" >
); return (
setIsHovering(true)} onMouseLeave={() => setIsHovering(false)} onFocus={() => setIsFocused(true)} onBlur={(e) => { if (!e.currentTarget.contains(e.relatedTarget)) { setIsFocused(false); } }} >
{ if ((e.target as HTMLElement).closest('[data-status-icon]')) { return; } if (!isServerInitializing) { initializeServer(serverName); } }} role="button" tabIndex={0} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); if (!isServerInitializing) { initializeServer(serverName); } } }} aria-disabled={isServerInitializing} > {statusIcon && (
{statusIcon}
)} {serverInfo.metadata.icon && (
)}
{serverName} {isServerInitializing && ( {localize('com_ui_initializing')} )}
{localize('com_ui_delete_tool_confirm')} } selection={{ selectHandler: () => removeTool(serverName), selectClasses: 'bg-red-700 dark:bg-red-600 hover:bg-red-800 dark:hover:bg-red-800 transition-color duration-200 text-white', selectText: localize('com_ui_delete'), }} /> {configDialogProps && } ); }