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 [displayMessages, setDisplayMessages] = useState<Message[]>([])
const [hasMore, setHasMore] = useState(false) const [hasMore, setHasMore] = useState(false)
const [isLoadingMore, setIsLoadingMore] = useState(false) const [isLoadingMore, setIsLoadingMore] = useState(false)
const [isProcessingContext, setIsProcessingContext] = useState(false)
const { messages, displayCount, loading, updateMessages, clearTopicMessages, deleteMessage } = const { messages, displayCount, loading, updateMessages, clearTopicMessages, deleteMessage } =
useMessageOperations(topic) useMessageOperations(topic)
@ -107,25 +108,32 @@ const Messages: React.FC<MessagesProps> = ({ assistant, topic, setActiveTopic })
} }
}), }),
EventEmitter.on(EVENT_NAMES.NEW_CONTEXT, async () => { EventEmitter.on(EVENT_NAMES.NEW_CONTEXT, async () => {
const messages = messagesRef.current if (isProcessingContext) return
setIsProcessingContext(true)
if (messages.length === 0) { try {
return 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() 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) => { EventEmitter.on(EVENT_NAMES.NEW_BRANCH, async (index: number) => {
const newTopic = getDefaultTopic(assistant.id) const newTopic = getDefaultTopic(assistant.id)
@ -151,7 +159,7 @@ const Messages: React.FC<MessagesProps> = ({ assistant, topic, setActiveTopic })
return () => unsubscribes.forEach((unsub) => unsub()) return () => unsubscribes.forEach((unsub) => unsub())
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [assistant, dispatch, scrollToBottom, topic]) }, [assistant, dispatch, scrollToBottom, topic, isProcessingContext])
useEffect(() => { useEffect(() => {
runAsyncFunction(async () => { runAsyncFunction(async () => {