import { useCallback, useEffect, useRef, useState } from "react"; import { Chat as ChatType, useAppContext } from "../../contexts/AppContext"; import { useChatContext } from "../../contexts/ChatContext"; import { useThemeContext } from "../../contexts/ThemeContext"; import { ChatMessage } from "./ChatMessage"; import JSONViewer from "./JSONViewer"; import PayloadViewer from "./PayloadViewer"; import ChatLoader from "./ChatLoader"; export interface ChatProps { readOnly?: boolean, chatData?: ChatType } export default function Chat({ readOnly = false, chatData }: ChatProps) { const { configs } = useAppContext(); const { selectedChat, chatUpdated, setChatUpdated, isLoadingChat } = useChatContext(); const { setChatBackground } = useThemeContext(); const bottomRef = useRef(null); const [trace, setTrace] = useState | null>(null); const [payload, setPayload] = useState(null); const [copied, setCopied] = useState<{ [key: number]: boolean }>({}); const [expandedMessages, setExpandedMessages] = useState<{ [key: number]: boolean; }>({}); const setCopiedMessages = useCallback((index: number, copied: boolean) => { setCopied((prevState) => ({ ...prevState, [index]: copied, })); if (copied) { setTimeout(() => { setCopied((prevState) => ({ ...prevState, [index]: false, })); }, 3000); } }, []); const toggleMessage = (index: number) => { setExpandedMessages((prevState) => ({ ...prevState, [index]: !prevState[index], })); }; const handleTraceClick = useCallback((traceData: Record) => { setTrace(traceData); }, []); const handlePayloadClick = useCallback((payloadData: any) => { setPayload(payloadData); }, []); useEffect(() => { if (chatUpdated && bottomRef.current && !readOnly) { const timer = setTimeout(() => { if (bottomRef.current) { bottomRef.current.scrollIntoView({ behavior: "smooth" }); } setChatUpdated(false); }, 100); return () => clearTimeout(timer); } }, [chatUpdated]); useEffect(() => { if (configs?.background_url) setChatBackground(configs?.background_url); }, [configs?.background_url]); const chatObject = chatData || selectedChat; useEffect(() => { if (bottomRef.current && !readOnly && !isLoadingChat && chatObject?.messages.length) { bottomRef.current.scrollIntoView({ behavior: "auto" }); } }, [isLoadingChat, selectedChat?.id]); if (isLoadingChat && !readOnly) { return } return (
{chatObject?.messages.map((message, index) => )}
setTrace(null)} /> setPayload(null)} />
); }