import React, { useEffect } from "react"; import { displayDate } from "@/_utils/datetime"; import { TextCode } from "../TextCode"; import { getMessageCode } from "@/_utils/message"; import { useSubscription } from "@apollo/client"; import { SubscribeMessageDocument, SubscribeMessageSubscription, } from "@/graphql"; import { useStore } from "@/_models/RootStore"; type Props = { id?: string; avatarUrl?: string; senderName: string; createdAt: number; text?: string; }; const StreamTextMessage: React.FC = ({ id, senderName, createdAt, avatarUrl = "", text = "", }) => { const [textMessage, setTextMessage] = React.useState(text); const [completedTyping, setCompletedTyping] = React.useState(false); const tokenIndex = React.useRef(0); const { historyStore } = useStore(); const { data } = useSubscription( SubscribeMessageDocument, { variables: { id, }, } ); useEffect(() => { if ( data?.messages_by_pk?.content && data.messages_by_pk.content.length > text.length ) { historyStore.finishActiveConversationWaiting(); } }, [data, text]); // eslint-disable-line react-hooks/exhaustive-deps useEffect(() => { setCompletedTyping(false); const stringResponse = data?.messages_by_pk?.content ?? text; const intervalId = setInterval(() => { setTextMessage(stringResponse.slice(0, tokenIndex.current)); tokenIndex.current++; if (tokenIndex.current > stringResponse.length) { clearInterval(intervalId); setCompletedTyping(true); } }, 20); return () => clearInterval(intervalId); }, [data?.messages_by_pk?.content, text]); return textMessage.length > 0 ? (
{senderName}
{displayDate(createdAt)}
{textMessage.includes("```") ? ( getMessageCode(textMessage).map((item, i) => (

{item.text}

{item.code.trim().length > 0 && }
)) ) : (

{textMessage}

)}
) : ( <> ); }; export default React.memo(StreamTextMessage);