2025-05-01 02:28:24 -07:00
|
|
|
import { PreviewMessage, ThinkingMessage } from './message';
|
|
|
|
|
import type { Vote } from '@/lib/db/schema';
|
|
|
|
|
import type { UIMessage } from 'ai';
|
2024-12-19 17:05:04 +05:30
|
|
|
import { memo } from 'react';
|
|
|
|
|
import equal from 'fast-deep-equal';
|
2025-05-01 02:28:24 -07:00
|
|
|
import type { UIArtifact } from './artifact';
|
|
|
|
|
import type { UseChatHelpers } from '@ai-sdk/react';
|
|
|
|
|
import { motion } from 'framer-motion';
|
|
|
|
|
import { useMessages } from '@/hooks/use-messages';
|
2024-12-03 17:49:38 +03:00
|
|
|
|
2025-02-13 08:25:57 -08:00
|
|
|
interface ArtifactMessagesProps {
|
2024-12-03 17:49:38 +03:00
|
|
|
chatId: string;
|
2025-03-11 15:33:18 -07:00
|
|
|
status: UseChatHelpers['status'];
|
2024-12-03 17:49:38 +03:00
|
|
|
votes: Array<Vote> | undefined;
|
2025-03-16 18:42:29 -07:00
|
|
|
messages: Array<UIMessage>;
|
2025-03-11 15:33:18 -07:00
|
|
|
setMessages: UseChatHelpers['setMessages'];
|
|
|
|
|
reload: UseChatHelpers['reload'];
|
2024-12-06 13:36:56 +03:00
|
|
|
isReadonly: boolean;
|
2025-02-13 08:25:57 -08:00
|
|
|
artifactStatus: UIArtifact['status'];
|
2024-12-03 17:49:38 +03:00
|
|
|
}
|
|
|
|
|
|
2025-02-13 08:25:57 -08:00
|
|
|
function PureArtifactMessages({
|
2024-12-03 17:49:38 +03:00
|
|
|
chatId,
|
2025-03-11 15:33:18 -07:00
|
|
|
status,
|
2024-12-03 17:49:38 +03:00
|
|
|
votes,
|
|
|
|
|
messages,
|
2024-12-05 15:29:33 +03:00
|
|
|
setMessages,
|
|
|
|
|
reload,
|
2024-12-06 13:36:56 +03:00
|
|
|
isReadonly,
|
2025-02-13 08:25:57 -08:00
|
|
|
}: ArtifactMessagesProps) {
|
2025-05-01 02:28:24 -07:00
|
|
|
const {
|
|
|
|
|
containerRef: messagesContainerRef,
|
|
|
|
|
endRef: messagesEndRef,
|
|
|
|
|
onViewportEnter,
|
|
|
|
|
onViewportLeave,
|
|
|
|
|
hasSentMessage,
|
|
|
|
|
} = useMessages({
|
|
|
|
|
chatId,
|
|
|
|
|
status,
|
|
|
|
|
});
|
2024-12-03 17:49:38 +03:00
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<div
|
|
|
|
|
ref={messagesContainerRef}
|
|
|
|
|
className="flex flex-col gap-4 h-full items-center overflow-y-scroll px-4 pt-20"
|
|
|
|
|
>
|
|
|
|
|
{messages.map((message, index) => (
|
|
|
|
|
<PreviewMessage
|
|
|
|
|
chatId={chatId}
|
|
|
|
|
key={message.id}
|
|
|
|
|
message={message}
|
2025-03-11 15:33:18 -07:00
|
|
|
isLoading={status === 'streaming' && index === messages.length - 1}
|
2024-12-03 17:49:38 +03:00
|
|
|
vote={
|
|
|
|
|
votes
|
|
|
|
|
? votes.find((vote) => vote.messageId === message.id)
|
|
|
|
|
: undefined
|
|
|
|
|
}
|
2024-12-05 15:29:33 +03:00
|
|
|
setMessages={setMessages}
|
|
|
|
|
reload={reload}
|
2024-12-06 13:36:56 +03:00
|
|
|
isReadonly={isReadonly}
|
2025-05-01 02:28:24 -07:00
|
|
|
requiresScrollPadding={
|
|
|
|
|
hasSentMessage && index === messages.length - 1
|
|
|
|
|
}
|
2024-12-03 17:49:38 +03:00
|
|
|
/>
|
|
|
|
|
))}
|
|
|
|
|
|
2025-05-01 02:28:24 -07:00
|
|
|
{status === 'submitted' &&
|
|
|
|
|
messages.length > 0 &&
|
|
|
|
|
messages[messages.length - 1].role === 'user' && <ThinkingMessage />}
|
|
|
|
|
|
|
|
|
|
<motion.div
|
2024-12-03 17:49:38 +03:00
|
|
|
ref={messagesEndRef}
|
|
|
|
|
className="shrink-0 min-w-[24px] min-h-[24px]"
|
2025-05-01 02:28:24 -07:00
|
|
|
onViewportLeave={onViewportLeave}
|
|
|
|
|
onViewportEnter={onViewportEnter}
|
2024-12-03 17:49:38 +03:00
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function areEqual(
|
2025-02-13 08:25:57 -08:00
|
|
|
prevProps: ArtifactMessagesProps,
|
|
|
|
|
nextProps: ArtifactMessagesProps,
|
2024-12-03 17:49:38 +03:00
|
|
|
) {
|
|
|
|
|
if (
|
2025-02-13 08:25:57 -08:00
|
|
|
prevProps.artifactStatus === 'streaming' &&
|
|
|
|
|
nextProps.artifactStatus === 'streaming'
|
2024-12-19 17:05:04 +05:30
|
|
|
)
|
2024-12-03 17:49:38 +03:00
|
|
|
return true;
|
|
|
|
|
|
2025-03-11 15:33:18 -07:00
|
|
|
if (prevProps.status !== nextProps.status) return false;
|
|
|
|
|
if (prevProps.status && nextProps.status) return false;
|
2024-12-19 17:05:04 +05:30
|
|
|
if (prevProps.messages.length !== nextProps.messages.length) return false;
|
|
|
|
|
if (!equal(prevProps.votes, nextProps.votes)) return false;
|
|
|
|
|
|
|
|
|
|
return true;
|
2024-12-03 17:49:38 +03:00
|
|
|
}
|
|
|
|
|
|
2025-02-13 08:25:57 -08:00
|
|
|
export const ArtifactMessages = memo(PureArtifactMessages, areEqual);
|