| 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<HTMLButtonElement>) => { | |
| 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 = <Stop onClick={handleStop} />; | |
| } else if (userStopped || continueSupported) { | |
| button = <Continue onClick={handleContinue} />; | |
| } else if (messages && messages.length > 0 && regenerateEnabled) { | |
| button = <Regenerate onClick={handleRegenerate} />; | |
| } | |
| return ( | |
| <div className="absolute bottom-4 right-0 z-[62]"> | |
| <div className="grow" /> | |
| <div className="flex items-center md:items-end"> | |
| <div | |
| className={cn('option-buttons', showPopover ? '' : opacityClass)} | |
| data-projection-id="173" | |
| > | |
| {button} | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| } | |