import React, { useEffect } from "react"; import { keyframes } from "@emotion/react"; import { Text } from "@mantine/core"; import { selectResponsed, } from './chatSlice'; import { useAppDispatch, useAppSelector } from '@/views/hooks'; import CodeBlock from "@/views/CodeBlock"; import { newMessage, updateLastMessage, selectGenerating, selectCurrentMessage, selecLastMessage, selecHasDone, } from './chatSlice'; const MessageBlink = () => { const responsed = useAppSelector(selectResponsed); const blink = keyframes({ '50%': { opacity: 0 }, }); return |; }; const getBlocks = (message) => { const messageText = message || ''; const regex = /```([\s\S]+?)```/g; let match; let lastIndex = 0; const blocks: string[] = []; while ((match = regex.exec(messageText))) { const unmatchedText = messageText.substring(lastIndex, match.index); const matchedText = match[0]; blocks.push(unmatchedText, matchedText); lastIndex = regex.lastIndex; } const unmatchedText = messageText.substring(lastIndex); blocks.push(unmatchedText); return blocks; } const CurrentMessage = () => { const dispatch = useAppDispatch(); const currentMessage = useAppSelector(selectCurrentMessage); const lastMessage = useAppSelector(selecLastMessage); const generating = useAppSelector(selectGenerating); const hasDone = useAppSelector(selecHasDone); const messageBlocks = getBlocks(currentMessage); const lastMessageBlocks = getBlocks(lastMessage?.message); const fixedCount = lastMessageBlocks.length; const receivedCount = messageBlocks.length; const renderBlocks = messageBlocks.splice(-1); useEffect(() => { if (generating) { // new a bot message dispatch(newMessage({ type: 'bot', message: currentMessage })); } if (hasDone) { // update the last one bot message dispatch(updateLastMessage({ type: 'bot', message: currentMessage })); } }, [generating, hasDone]); useEffect(() => { if (receivedCount - fixedCount >= 1) { dispatch(updateLastMessage({ type: 'bot', message: currentMessage })); } }, [currentMessage]); return generating ? <> : <>; }; export default CurrentMessage;