import { PreviewMessage } from './message'; import { useScrollToBottom } from './use-scroll-to-bottom'; import { Vote } from '@/lib/db/schema'; import { ChatRequestOptions, Message } from 'ai'; import { memo } from 'react'; import equal from 'fast-deep-equal'; import { UIArtifact } from './artifact'; interface ArtifactMessagesProps { chatId: string; isLoading: boolean; votes: Array | undefined; messages: Array; setMessages: ( messages: Message[] | ((messages: Message[]) => Message[]), ) => void; reload: ( chatRequestOptions?: ChatRequestOptions, ) => Promise; isReadonly: boolean; artifactStatus: UIArtifact['status']; } function PureArtifactMessages({ chatId, isLoading, votes, messages, setMessages, reload, isReadonly, }: ArtifactMessagesProps) { const [messagesContainerRef, messagesEndRef] = useScrollToBottom(); return (
{messages.map((message, index) => ( vote.messageId === message.id) : undefined } setMessages={setMessages} reload={reload} isReadonly={isReadonly} /> ))}
); } function areEqual( prevProps: ArtifactMessagesProps, nextProps: ArtifactMessagesProps, ) { if ( prevProps.artifactStatus === 'streaming' && nextProps.artifactStatus === 'streaming' ) return true; if (prevProps.isLoading !== nextProps.isLoading) return false; if (prevProps.isLoading && nextProps.isLoading) return false; if (prevProps.messages.length !== nextProps.messages.length) return false; if (!equal(prevProps.votes, nextProps.votes)) return false; return true; } export const ArtifactMessages = memo(PureArtifactMessages, areEqual);