From 62de2931949226543ec930261329b59fdb776b41 Mon Sep 17 00:00:00 2001 From: one Date: Wed, 19 Mar 2025 17:31:22 +0800 Subject: [PATCH] fix: race condition in new context event --- .../src/pages/home/Messages/Messages.tsx | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/src/renderer/src/pages/home/Messages/Messages.tsx b/src/renderer/src/pages/home/Messages/Messages.tsx index 926809d2..fb34ed9d 100644 --- a/src/renderer/src/pages/home/Messages/Messages.tsx +++ b/src/renderer/src/pages/home/Messages/Messages.tsx @@ -46,6 +46,7 @@ const Messages: React.FC = ({ assistant, topic, setActiveTopic }) const [displayMessages, setDisplayMessages] = useState([]) const [hasMore, setHasMore] = useState(false) const [isLoadingMore, setIsLoadingMore] = useState(false) + const [isProcessingContext, setIsProcessingContext] = useState(false) const { messages, displayCount, loading, updateMessages, clearTopicMessages, deleteMessage } = useMessageOperations(topic) @@ -107,25 +108,32 @@ const Messages: React.FC = ({ assistant, topic, setActiveTopic }) } }), EventEmitter.on(EVENT_NAMES.NEW_CONTEXT, async () => { - const messages = messagesRef.current + if (isProcessingContext) return + setIsProcessingContext(true) - if (messages.length === 0) { - return - } + try { + const messages = messagesRef.current - const lastMessage = last(messages) + if (messages.length === 0) { + return + } + + const lastMessage = last(messages) + + if (lastMessage?.type === 'clear') { + await deleteMessage(lastMessage) + scrollToBottom() + return + } + + const clearMessage = getUserMessage({ assistant, topic, type: 'clear' }) + const newMessages = [...messages, clearMessage] + await updateMessages(newMessages) - if (lastMessage?.type === 'clear') { - deleteMessage(lastMessage) scrollToBottom() - return + } finally { + setIsProcessingContext(false) } - - const clearMessage = getUserMessage({ assistant, topic, type: 'clear' }) - const newMessages = [...messages, clearMessage] - await updateMessages(newMessages) - - scrollToBottom() }), EventEmitter.on(EVENT_NAMES.NEW_BRANCH, async (index: number) => { const newTopic = getDefaultTopic(assistant.id) @@ -151,7 +159,7 @@ const Messages: React.FC = ({ assistant, topic, setActiveTopic }) return () => unsubscribes.forEach((unsub) => unsub()) // eslint-disable-next-line react-hooks/exhaustive-deps - }, [assistant, dispatch, scrollToBottom, topic]) + }, [assistant, dispatch, scrollToBottom, topic, isProcessingContext]) useEffect(() => { runAsyncFunction(async () => {