import React, { useEffect, useMemo, useRef } from "react";
import { MessagesProps } from "./props";
import { useChatContext } from "./ChatContext";
import { Message } from "@copilotkit/shared";
import { useCopilotChatInternal } from "@copilotkit/react-core";
import {
LegacyRenderMessage,
LegacyRenderProps,
} from "./messages/LegacyRenderMessage";
export const Messages = ({
inProgress,
children,
RenderMessage,
AssistantMessage,
UserMessage,
ErrorMessage,
ImageRenderer,
onRegenerate,
onCopy,
onThumbsUp,
onThumbsDown,
messageFeedback,
markdownTagRenderers,
chatError,
// Legacy props
RenderTextMessage,
RenderActionExecutionMessage,
RenderAgentStateMessage,
RenderResultMessage,
RenderImageMessage,
}: MessagesProps) => {
const { labels, icons } = useChatContext();
const { messages: visibleMessages, interrupt } = useCopilotChatInternal();
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(
"[CopilotKit] Legacy message render props (RenderTextMessage, RenderActionExecutionMessage, etc.) are deprecated. " +
"Please use the unified 'RenderMessage' prop instead. " +
"See migration guide: https://docs.copilotkit.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) => (