import { useEffect, useState } from 'react'; import type { TMessage } from 'librechat-data-provider'; import { useMessageHandler, useMediaQuery, useGenerations } from '~/hooks'; import { cn } from '~/utils'; import Regenerate from './Regenerate'; import Continue from './Continue'; import Stop from './Stop'; type GenerationButtonsProps = { endpoint: string; showPopover: boolean; opacityClass: string; }; export default function GenerationButtons({ endpoint, showPopover, opacityClass, }: GenerationButtonsProps) { const { messages, isSubmitting, latestMessage, handleContinue, handleRegenerate, handleStopGenerating, } = useMessageHandler(); const isSmallScreen = useMediaQuery('(max-width: 768px)'); const { continueSupported, regenerateEnabled } = useGenerations({ endpoint, message: latestMessage as TMessage, isSubmitting, }); const [userStopped, setUserStopped] = useState(false); const handleStop = (e: React.MouseEvent) => { setUserStopped(true); handleStopGenerating(e); }; useEffect(() => { let timer: NodeJS.Timeout; if (userStopped) { timer = setTimeout(() => { setUserStopped(false); }, 200); } return () => { clearTimeout(timer); }; }, [userStopped]); if (isSmallScreen) { return null; } let button: React.ReactNode = null; if (isSubmitting) { button = ; } else if (userStopped || continueSupported) { button = ; } else if (messages && messages.length > 0 && regenerateEnabled) { button = ; } return (
{button}
); }