import { useCallback, useMemo } from 'react' import { Message, TextContentBlock } from '@janhq/core' import { Tooltip } from '@janhq/joi' import { useSetAtom } from 'jotai' import { CopyIcon, Trash2Icon, CheckIcon, PencilIcon, RefreshCcw, } from 'lucide-react' import { useClipboard } from '@/hooks/useClipboard' import useMessageDeleteMutation from '@/hooks/useMessageDeleteMutation' import { deleteMessageAtom, editMessageAtom, } from '@/helpers/atoms/ChatMessage.atom' type Props = { isLastMessage: boolean message: Message onResendMessage: () => void } const MessageToolbar: React.FC = ({ isLastMessage, message, onResendMessage, }) => { const deleteMessage = useSetAtom(deleteMessageAtom) const setEditMessage = useSetAtom(editMessageAtom) const clipboard = useClipboard({ timeout: 1000 }) const deleteCortexMessage = useMessageDeleteMutation() const onDeleteClick = useCallback( async (threadId: string, messageId: string) => { await deleteCortexMessage.mutateAsync({ threadId, messageId, }) deleteMessage(messageId) }, [deleteMessage, deleteCortexMessage] ) const onCopyClick = useCallback(() => { const messageContent = message.content[0] if (!messageContent) return if (messageContent.type === 'text') { const textContentBlock = messageContent as TextContentBlock clipboard.copy(textContentBlock.text.value) } }, [clipboard, message]) const onRegenerateClick = useCallback(async () => { // current message must be from assistant if (message.role !== 'assistant') return await deleteCortexMessage.mutateAsync({ threadId: message.thread_id, messageId: message.id, }) deleteMessage(message.id) onResendMessage() }, [deleteCortexMessage, deleteMessage, onResendMessage, message]) const allowRegenerate = useMemo( () => isLastMessage && message.role === 'assistant', [isLastMessage, message] ) const allowEditMessage = useMemo( () => message.role === 'user' && message.content[0]?.type === 'text', [message] ) if (message.status === 'in_progress') return null return (
{allowEditMessage && (
setEditMessage(message.id)} >
)} {allowRegenerate && (
)}
{clipboard.copied ? ( ) : ( } content="Copy" /> )}
onDeleteClick(message.thread_id, message.id)} > } content="Delete" />
) } export default MessageToolbar