import { Message } from '@/types'; import { IconEdit } from '@tabler/icons-react'; import { useTranslation } from 'next-i18next'; import { FC, useEffect, useRef, useState } from 'react'; import ReactMarkdown from 'react-markdown'; import rehypeMathjax from 'rehype-mathjax'; import remarkGfm from 'remark-gfm'; import remarkMath from 'remark-math'; import { CodeBlock } from '../Markdown/CodeBlock'; import { CopyButton } from './CopyButton'; interface Props { message: Message; messageIndex: number; lightMode: 'light' | 'dark'; onEditMessage: (message: Message, messageIndex: number) => void; } export const ChatMessage: FC = ({ message, messageIndex, lightMode, onEditMessage, }) => { const { t } = useTranslation('chat'); const [isEditing, setIsEditing] = useState(false); const [isHovering, setIsHovering] = 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 (
setIsHovering(true)} onMouseLeave={() => setIsHovering(false)} >
{message.role === 'assistant' ? t('AI') : t('You')}:
{message.role === 'user' ? (
{isEditing ? (