import React from 'react'; import * as Ariakit from '@ariakit/react'; import { ChevronRight } from 'lucide-react'; import { MCPIcon, PinIcon } from '@librechat/client'; import MCPServerMenuItem from '~/components/MCP/MCPServerMenuItem'; import MCPConfigDialog from '~/components/MCP/MCPConfigDialog'; import { useBadgeRowContext } from '~/Providers'; import { useLocalize } from '~/hooks'; import { cn } from '~/utils'; interface MCPSubMenuProps { placeholder?: string; } const MCPSubMenu = React.forwardRef( ({ placeholder, ...props }, ref) => { const localize = useLocalize(); const { storageContextKey, mcpServerManager } = useBadgeRowContext(); const { isPinned, mcpValues, setIsPinned, placeholderText, selectableServers, connectionStatus, isInitializing, getConfigDialogProps, toggleServerSelection, getServerStatusIconProps, } = mcpServerManager; const menuStore = Ariakit.useMenuStore({ focusLoop: true, showTimeout: 100, placement: 'right', }); // Don't render if no MCP servers are configured if (!selectableServers || selectableServers.length === 0) { return null; } const configDialogProps = getConfigDialogProps(); return (
) => { e.stopPropagation(); menuStore.toggle(); }} className="flex w-full cursor-pointer items-center justify-between rounded-lg p-2 hover:bg-surface-hover" /> } >
{selectableServers.map((server) => ( ))}
{configDialogProps && ( )}
); }, ); MCPSubMenu.displayName = 'MCPSubMenu'; export default React.memo(MCPSubMenu);