import { memo, useCallback } from "react"; import ReactMarkdown from "react-markdown"; import remarkGfm from "remark-gfm"; import classNames from "classnames"; import SmartToyIcon from "@mui/icons-material/SmartToy"; import ContentCopyIcon from "@mui/icons-material/ContentCopy"; import DataObjectOutlinedIcon from "@mui/icons-material/DataObjectOutlined"; import { Button } from "@mui/material"; import { green } from "@mui/material/colors"; import { CopyToClipboard } from "react-copy-to-clipboard"; import { ChatReference, Message, ShowReference, isDataEmpty, useAppContext } from "../.."; import FeedbackButtons from "./FeedbackButtons"; import { useChatContext } from "../../contexts/ChatContext"; export interface ChatMessageProps { message: Message; index: number; readOnly?: boolean; onCopyStateChange?: (index: number, copied: boolean) => void; onTraceClick?: (trace: any) => void; onPayloadClick?: (payload: any) => void; onReferenceToggle?: (index: number) => void; expandedReferences?: { [key: number]: boolean }; copiedStates?: { [key: number]: boolean }; } export const ChatMessage = memo(({ message, index, readOnly = false, onCopyStateChange, onTraceClick, onPayloadClick, onReferenceToggle, expandedReferences = {}, copiedStates = {}, }: ChatMessageProps) => { const { configs } = useAppContext(); const { selectedChat, submitFeedback } = useChatContext(); const handleCopy = useCallback(() => { onCopyStateChange?.(index, true); }, [index, onCopyStateChange]); const handleTraceClick = useCallback(() => { onTraceClick?.(message.trace ?? {}); }, [message.trace, onTraceClick]); const handlePayloadClick = useCallback(() => { onPayloadClick?.(message.payload); }, [message.payload, onPayloadClick]); const handleReferenceToggle = useCallback(() => { onReferenceToggle?.(index); }, [index, onReferenceToggle]); if (message.msg_type === "system") { return (
{configs?.bot_icon_url ? ( Custom Icon ) : ( )}
( {props.children} ), ul: ({ children }) => (
    {children}
), ol: ({ children }) => (
    {children}
), li: ({ children }) => (
  • {children}
  • ), table: ({ children }) => ( {children}
    ), th: ({ children }) => ( {children} ), td: ({ children }) => ( {children} ), }} > {message.text}
    {import.meta.env.DEV && (
    {!isDataEmpty(message.trace) && (
    )} {!isDataEmpty(message.payload) && (
    )}
    )}
    {!readOnly && selectedChat && submitFeedback && ( )} {message.retrieval_results && message.retrieval_results.length > 0 && (
    Show References ({message.retrieval_results.length})
    )}
    {copiedStates[index] ? ( Copied! ) : ( Copy )}
    {expandedReferences[index] && ( )}
    ); } else { return (
    {message.text}
    ); } }, (prevProps, nextProps) => { return ( prevProps.message === nextProps.message && JSON.stringify(prevProps.expandedReferences) === JSON.stringify(nextProps.expandedReferences) && JSON.stringify(prevProps.copiedStates) === JSON.stringify(nextProps.copiedStates) ); });