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,6 +108,10 @@ const Messages: React.FC<MessagesProps> = ({ assistant, topic, setActiveTopic })
} }
}), }),
EventEmitter.on(EVENT_NAMES.NEW_CONTEXT, async () => { EventEmitter.on(EVENT_NAMES.NEW_CONTEXT, async () => {
if (isProcessingContext) return
setIsProcessingContext(true)
try {
const messages = messagesRef.current const messages = messagesRef.current
if (messages.length === 0) { if (messages.length === 0) {
@ -116,7 +121,7 @@ const Messages: React.FC<MessagesProps> = ({ assistant, topic, setActiveTopic })
const lastMessage = last(messages) const lastMessage = last(messages)
if (lastMessage?.type === 'clear') { if (lastMessage?.type === 'clear') {
deleteMessage(lastMessage) await deleteMessage(lastMessage)
scrollToBottom() scrollToBottom()
return return
} }
@ -126,6 +131,9 @@ const Messages: React.FC<MessagesProps> = ({ assistant, topic, setActiveTopic })
await updateMessages(newMessages) await updateMessages(newMessages)
scrollToBottom() scrollToBottom()
} finally {
setIsProcessingContext(false)
}
}), }),
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 () => {