import { UIMessage } from 'ai'; import { PreviewMessage, ThinkingMessage } from './message'; import { useScrollToBottom } from './use-scroll-to-bottom'; import { Overview } from './overview'; import { memo } from 'react'; import { Vote } from '@/lib/db/schema'; import equal from 'fast-deep-equal'; import { UseChatHelpers } from '@ai-sdk/react'; interface MessagesProps { chatId: string; status: UseChatHelpers['status']; votes: Array | undefined; messages: Array; setMessages: UseChatHelpers['setMessages']; reload: UseChatHelpers['reload']; isReadonly: boolean; isArtifactVisible: boolean; } function PureMessages({ chatId, status, votes, messages, setMessages, reload, isReadonly, }: MessagesProps) { const [messagesContainerRef, messagesEndRef] = useScrollToBottom(); return (
{messages.length === 0 && } {messages.map((message, index) => ( vote.messageId === message.id) : undefined } setMessages={setMessages} reload={reload} isReadonly={isReadonly} /> ))} {status === 'submitted' && messages.length > 0 && messages[messages.length - 1].role === 'user' && }
); } export const Messages = memo(PureMessages, (prevProps, nextProps) => { if (prevProps.isArtifactVisible && nextProps.isArtifactVisible) return true; if (prevProps.status !== nextProps.status) return false; if (prevProps.status && nextProps.status) return false; if (prevProps.messages.length !== nextProps.messages.length) return false; if (!equal(prevProps.messages, nextProps.messages)) return false; if (!equal(prevProps.votes, nextProps.votes)) return false; return true; });