import React, { useState } from 'react'; import { UIResourceRenderer } from '@mcp-ui/client'; import type { UIResource } from 'librechat-data-provider'; import useSubmitMessage from '~/hooks/Messages/useSubmitMessage'; import { handleUIAction } from '~/utils'; interface UIResourceCarouselProps { uiResources: UIResource[]; } const UIResourceCarousel: React.FC = React.memo(({ uiResources }) => { const [showLeftArrow, setShowLeftArrow] = useState(false); const [showRightArrow, setShowRightArrow] = useState(true); const [isContainerHovered, setIsContainerHovered] = useState(false); const scrollContainerRef = React.useRef(null); const { submitMessage } = useSubmitMessage(); const handleScroll = React.useCallback(() => { if (!scrollContainerRef.current) return; const { scrollLeft, scrollWidth, clientWidth } = scrollContainerRef.current; setShowLeftArrow(scrollLeft > 0); setShowRightArrow(scrollLeft < scrollWidth - clientWidth - 10); }, []); const scroll = React.useCallback((direction: 'left' | 'right') => { if (!scrollContainerRef.current) return; const viewportWidth = scrollContainerRef.current.clientWidth; const scrollAmount = Math.floor(viewportWidth * 0.9); const currentScroll = scrollContainerRef.current.scrollLeft; const newScroll = direction === 'left' ? currentScroll - scrollAmount : currentScroll + scrollAmount; scrollContainerRef.current.scrollTo({ left: newScroll, behavior: 'smooth', }); }, []); React.useEffect(() => { const container = scrollContainerRef.current; if (container) { container.addEventListener('scroll', handleScroll); handleScroll(); return () => container.removeEventListener('scroll', handleScroll); } }, [handleScroll]); if (uiResources.length === 0) { return null; } return (
setIsContainerHovered(true)} onMouseLeave={() => setIsContainerHovered(false)} >
{showLeftArrow && ( )}
{uiResources.map((uiResource, index) => { const height = 360; const width = 230; return (
handleUIAction(result, submitMessage)} htmlProps={{ autoResizeIframe: { width: true, height: true }, }} />
); })}
{showRightArrow && ( )}
); }); export default UIResourceCarousel;