fix: race condition in new context event

This commit is contained in:
one 2025-03-19 17:31:22 +08:00 committed by Asurada
parent 9a65a1e7c7
commit 62de293194

View File

@ -46,6 +46,7 @@ const Messages: React.FC<MessagesProps> = ({ assistant, topic, setActiveTopic })
const [displayMessages, setDisplayMessages] = useState<Message[]>([])
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<MessagesProps> = ({ 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<MessagesProps> = ({ 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 () => {