import { Message } from '@/types/chat'; import { IconEdit } from '@tabler/icons-react'; import { useTranslation } from 'next-i18next'; import { FC, memo, useEffect, useRef, useState } from 'react'; import { IconCheck, IconCopy } from '@tabler/icons-react'; import rehypeMathjax from 'rehype-mathjax'; import remarkGfm from 'remark-gfm'; import remarkMath from 'remark-math'; import { CodeBlock } from '../Markdown/CodeBlock'; import { MemoizedReactMarkdown } from '../Markdown/MemoizedReactMarkdown'; interface Props { message: Message; messageIndex: number; onEditMessage: (message: Message, messageIndex: number) => void; } export const ChatMessage: FC = memo( ({ message, messageIndex, onEditMessage }) => { const { t } = useTranslation('chat'); const [isEditing, setIsEditing] = useState(false); const [messageContent, setMessageContent] = useState(message.content); const [messagedCopied, setMessageCopied] = useState(false); const textareaRef = useRef(null); const toggleEditing = () => { setIsEditing(!isEditing); }; const handleInputChange = ( event: React.ChangeEvent, ) => { setMessageContent(event.target.value); if (textareaRef.current) { textareaRef.current.style.height = 'inherit'; textareaRef.current.style.height = `${textareaRef.current.scrollHeight}px`; } }; const handleEditMessage = () => { if (message.content != messageContent) { onEditMessage({ ...message, content: messageContent }, messageIndex); } setIsEditing(false); }; const handlePressEnter = (e: React.KeyboardEvent) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleEditMessage(); } }; const copyOnClick = () => { if (!navigator.clipboard) return; navigator.clipboard.writeText(message.content).then(() => { setMessageCopied(true); setTimeout(() => { setMessageCopied(false); }, 2000); }); }; useEffect(() => { if (textareaRef.current) { textareaRef.current.style.height = 'inherit'; textareaRef.current.style.height = `${textareaRef.current.scrollHeight}px`; } }, [isEditing]); return (
{message.role === 'assistant' ? t('AI') : t('You')}:
{message.role === 'user' ? (
{isEditing ? (