import { useEffect, useMemo, useRef } from "react";
import { MessagesProps } from "./props";
import { useChatContext } from "./ChatContext";
import { Message } from "@vn-sdk/shared";
import { useAiChatInternal as useAiChat } from "@vn-sdk/react-core";
import { LegacyRenderMessage, LegacyRenderProps } from "./messages/LegacyRenderMessage";
export const Messages = ({
inProgress,
children,
RenderMessage,
AssistantMessage,
UserMessage,
ErrorMessage,
ImageRenderer,
onRegenerate,
onCopy,
onThumbsUp,
onThumbsDown,
markdownTagRenderers,
chatError,
// Legacy props
RenderTextMessage,
RenderActionExecutionMessage,
RenderAgentStateMessage,
RenderResultMessage,
RenderImageMessage,
}: MessagesProps) => {
const { labels } = useChatContext();
const { messages: visibleMessages, interrupt } = useAiChat();
const initialMessages = useMemo(() => makeInitialMessages(labels.initial), [labels.initial]);
const messages = [...initialMessages, ...visibleMessages];
const { messagesContainerRef, messagesEndRef } = useScrollToBottom(messages);
// Check if any legacy props are provided
const hasLegacyProps = !!(
RenderTextMessage ||
RenderActionExecutionMessage ||
RenderAgentStateMessage ||
RenderResultMessage ||
RenderImageMessage
);
// Show deprecation warning if legacy props are used
useEffect(() => {
if (hasLegacyProps) {
console.warn(
"[VN SDK] Legacy message render props (RenderTextMessage, RenderActionExecutionMessage, etc.) are deprecated. " +
"Please use the unified 'RenderMessage' prop instead. " +
"See migration guide: https://docs.vn.ai/migration/render-message",
);
}
}, [hasLegacyProps]);
// Create legacy props object for the adapter
const legacyProps: LegacyRenderProps = useMemo(
() => ({
RenderTextMessage,
RenderActionExecutionMessage,
RenderAgentStateMessage,
RenderResultMessage,
RenderImageMessage,
}),
[
RenderTextMessage,
RenderActionExecutionMessage,
RenderAgentStateMessage,
RenderResultMessage,
RenderImageMessage,
],
);
// Determine which render component to use
const MessageRenderer = hasLegacyProps
? (props: any) =>