fix(MessageMenubar, useMessageOperations): Enhance loading state handling

- Added loading state checks in MessageMenubar to prevent actions during loading.
- Updated useMessageOperations to await database updates for message operations.
- Improved error handling for message edits and resends to ensure proper state management.
This commit is contained in:
MyPrototypeWhat 2025-03-13 17:05:53 +08:00 committed by 亢奋猫
parent 98937310d3
commit 6f973741a2
3 changed files with 16 additions and 18 deletions

View File

@ -61,7 +61,7 @@ export function useMessageOperations(topic: Topic) {
updates updates
}) })
) )
db.topics.update(topic.id, { await db.topics.update(topic.id, {
messages: messages.map((m) => (m.id === messageId ? { ...m, ...updates } : m)) messages: messages.map((m) => (m.id === messageId ? { ...m, ...updates } : m))
}) })
}, },

View File

@ -16,7 +16,6 @@ import SelectModelPopup from '@renderer/components/Popups/SelectModelPopup'
import TextEditPopup from '@renderer/components/Popups/TextEditPopup' import TextEditPopup from '@renderer/components/Popups/TextEditPopup'
import { TranslateLanguageOptions } from '@renderer/config/translate' import { TranslateLanguageOptions } from '@renderer/config/translate'
import { useMessageOperations } from '@renderer/hooks/useMessageOperations' import { useMessageOperations } from '@renderer/hooks/useMessageOperations'
import { modelGenerating } from '@renderer/hooks/useRuntime'
import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService'
import { getMessageTitle, resetAssistantMessage } from '@renderer/services/MessagesService' import { getMessageTitle, resetAssistantMessage } from '@renderer/services/MessagesService'
import { translateText } from '@renderer/services/TranslateService' import { translateText } from '@renderer/services/TranslateService'
@ -57,6 +56,7 @@ const MessageMenubar: FC<Props> = (props) => {
const assistantModel = assistant?.model const assistantModel = assistant?.model
const { const {
messages, messages,
loading,
editMessage, editMessage,
setStreamMessage, setStreamMessage,
deleteMessage, deleteMessage,
@ -79,15 +79,15 @@ const MessageMenubar: FC<Props> = (props) => {
) )
const onNewBranch = useCallback(async () => { const onNewBranch = useCallback(async () => {
await modelGenerating() if (loading) return
EventEmitter.emit(EVENT_NAMES.NEW_BRANCH, index) EventEmitter.emit(EVENT_NAMES.NEW_BRANCH, index)
window.message.success({ content: t('chat.message.new.branch.created'), key: 'new-branch' }) window.message.success({ content: t('chat.message.new.branch.created'), key: 'new-branch' })
}, [index, t]) }, [index, t, loading])
const handleResendUserMessage = useCallback( const handleResendUserMessage = useCallback(
async (messageUpdate?: Message) => { async (messageUpdate?: Message) => {
// messageUpdate 为了处理用户消息更改后的message // messageUpdate 为了处理用户消息更改后的message
await modelGenerating() if (loading) return
const groupdMessages = messages.filter((m) => m.askId === message.id) const groupdMessages = messages.filter((m) => m.askId === message.id)
// Resend all grouped messages // Resend all grouped messages
@ -101,7 +101,7 @@ const MessageMenubar: FC<Props> = (props) => {
await resendMessage(messageUpdate ?? message, assistant) await resendMessage(messageUpdate ?? message, assistant)
}, },
[message, assistantModel, resendMessage, assistant] [message, assistantModel, resendMessage, assistant, messages, loading]
) )
const onEdit = useCallback(async () => { const onEdit = useCallback(async () => {
@ -123,16 +123,12 @@ const MessageMenubar: FC<Props> = (props) => {
) : null ) : null
} }
}) })
if (editedText && editedText !== message.content) { if (editedText && editedText !== message.content && resendMessage) {
// 同步修改store中用户消息 // 同步修改store中用户消息
editMessage(message.id, { content: editedText }) await editMessage(message.id, { content: editedText })
handleResendUserMessage({ ...message, content: editedText })
// const updatedMessages = onGetMessages?.() || []
// dispatch(updateMessages(topic, updatedMessages))
} }
}, [message, editMessage, handleResendUserMessage, t])
if (resendMessage) handleResendUserMessage({ ...message, content: editedText })
}, [message, editMessage, topic, handleResendUserMessage, t])
const handleTranslate = useCallback( const handleTranslate = useCallback(
async (language: string) => { async (language: string) => {
@ -238,7 +234,7 @@ const MessageMenubar: FC<Props> = (props) => {
const onRegenerate = async (e: React.MouseEvent | undefined) => { const onRegenerate = async (e: React.MouseEvent | undefined) => {
e?.stopPropagation?.() e?.stopPropagation?.()
await modelGenerating() if (loading) return
const selectedModel = isGrouped ? model : assistantModel const selectedModel = isGrouped ? model : assistantModel
const _message = resetAssistantMessage(message, selectedModel) const _message = resetAssistantMessage(message, selectedModel)
editMessage(message.id, { ..._message }) editMessage(message.id, { ..._message })
@ -247,7 +243,7 @@ const MessageMenubar: FC<Props> = (props) => {
const onMentionModel = async (e: React.MouseEvent) => { const onMentionModel = async (e: React.MouseEvent) => {
e.stopPropagation() e.stopPropagation()
await modelGenerating() if (loading) return
const selectedModel = await SelectModelPopup.show({ model }) const selectedModel = await SelectModelPopup.show({ model })
if (!selectedModel) return if (!selectedModel) return
resendMessage(message, { ...assistant, model: selectedModel }, true) resendMessage(message, { ...assistant, model: selectedModel }, true)

View File

@ -382,10 +382,12 @@ export const resendMessage =
if (message.role === 'user') { if (message.role === 'user') {
// 查找此用户消息对应的助手消息 // 查找此用户消息对应的助手消息
const assistantMessage = topicMessages.find((m) => m.role === 'assistant' && m.askId === message.id) const assistantMessage = topicMessages.find((m) => m.role === 'assistant' && m.askId === message.id)
return dispatch( return dispatch(
sendMessage(message, assistant, topic, { sendMessage(message, assistant, topic, {
resendAssistantMessage: assistantMessage resendAssistantMessage: assistantMessage,
// 用户可能把助手消息删了,然后重新发送用户消息
// 如果isMentionModel为false,则只会发送add助手消息
isMentionModel: !assistantMessage
}) })
) )
} }