| 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> |
| ); |
| } |
|
|