import React, { useState } from 'react'; import { useRecoilState } from 'recoil'; import type { TConversation, TMessage } from 'librechat-data-provider'; import { EditIcon, Clipboard, CheckMark, ContinueIcon, RegenerateIcon } from '~/components/svg'; import { useGenerationsByLatest, useLocalize } from '~/hooks'; import { Fork } from '~/components/Conversations'; import MessageAudio from './MessageAudio'; import { cn } from '~/utils'; import store from '~/store'; type THoverButtons = { isEditing: boolean; enterEdit: (cancel?: boolean) => void; copyToClipboard: (setIsCopied: React.Dispatch>) => void; conversation: TConversation | null; isSubmitting: boolean; message: TMessage; regenerate: () => void; handleContinue: (e: React.MouseEvent) => void; latestMessage: TMessage | null; isLast: boolean; index: number; }; export default function HoverButtons({ index, isEditing, enterEdit, copyToClipboard, conversation, isSubmitting, message, regenerate, handleContinue, latestMessage, isLast, }: THoverButtons) { const localize = useLocalize(); const { endpoint: _endpoint, endpointType } = conversation ?? {}; const endpoint = endpointType ?? _endpoint; const [isCopied, setIsCopied] = useState(false); const [TextToSpeech] = useRecoilState(store.textToSpeech); const { hideEditButton, regenerateEnabled, continueSupported, forkingSupported, isEditableEndpoint, } = useGenerationsByLatest({ isEditing, isSubmitting, message, endpoint: endpoint ?? '', latestMessage, }); if (!conversation) { return null; } const { isCreatedByUser, error } = message; if (error) { return null; } const onEdit = () => { if (isEditing) { return enterEdit(true); } enterEdit(); }; return (
{TextToSpeech && ( )} {isEditableEndpoint && ( )} {regenerateEnabled ? ( ) : null} {continueSupported === true ? ( ) : null}
); }