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:
parent
98937310d3
commit
6f973741a2
@ -61,7 +61,7 @@ export function useMessageOperations(topic: Topic) {
|
||||
updates
|
||||
})
|
||||
)
|
||||
db.topics.update(topic.id, {
|
||||
await db.topics.update(topic.id, {
|
||||
messages: messages.map((m) => (m.id === messageId ? { ...m, ...updates } : m))
|
||||
})
|
||||
},
|
||||
|
||||
@ -16,7 +16,6 @@ import SelectModelPopup from '@renderer/components/Popups/SelectModelPopup'
|
||||
import TextEditPopup from '@renderer/components/Popups/TextEditPopup'
|
||||
import { TranslateLanguageOptions } from '@renderer/config/translate'
|
||||
import { useMessageOperations } from '@renderer/hooks/useMessageOperations'
|
||||
import { modelGenerating } from '@renderer/hooks/useRuntime'
|
||||
import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService'
|
||||
import { getMessageTitle, resetAssistantMessage } from '@renderer/services/MessagesService'
|
||||
import { translateText } from '@renderer/services/TranslateService'
|
||||
@ -57,6 +56,7 @@ const MessageMenubar: FC<Props> = (props) => {
|
||||
const assistantModel = assistant?.model
|
||||
const {
|
||||
messages,
|
||||
loading,
|
||||
editMessage,
|
||||
setStreamMessage,
|
||||
deleteMessage,
|
||||
@ -79,15 +79,15 @@ const MessageMenubar: FC<Props> = (props) => {
|
||||
)
|
||||
|
||||
const onNewBranch = useCallback(async () => {
|
||||
await modelGenerating()
|
||||
if (loading) return
|
||||
EventEmitter.emit(EVENT_NAMES.NEW_BRANCH, index)
|
||||
window.message.success({ content: t('chat.message.new.branch.created'), key: 'new-branch' })
|
||||
}, [index, t])
|
||||
}, [index, t, loading])
|
||||
|
||||
const handleResendUserMessage = useCallback(
|
||||
async (messageUpdate?: Message) => {
|
||||
// messageUpdate 为了处理用户消息更改后的message
|
||||
await modelGenerating()
|
||||
if (loading) return
|
||||
const groupdMessages = messages.filter((m) => m.askId === message.id)
|
||||
|
||||
// Resend all grouped messages
|
||||
@ -101,7 +101,7 @@ const MessageMenubar: FC<Props> = (props) => {
|
||||
|
||||
await resendMessage(messageUpdate ?? message, assistant)
|
||||
},
|
||||
[message, assistantModel, resendMessage, assistant]
|
||||
[message, assistantModel, resendMessage, assistant, messages, loading]
|
||||
)
|
||||
|
||||
const onEdit = useCallback(async () => {
|
||||
@ -123,16 +123,12 @@ const MessageMenubar: FC<Props> = (props) => {
|
||||
) : null
|
||||
}
|
||||
})
|
||||
if (editedText && editedText !== message.content) {
|
||||
if (editedText && editedText !== message.content && resendMessage) {
|
||||
// 同步修改store中用户消息
|
||||
editMessage(message.id, { content: editedText })
|
||||
|
||||
// const updatedMessages = onGetMessages?.() || []
|
||||
// dispatch(updateMessages(topic, updatedMessages))
|
||||
await editMessage(message.id, { content: editedText })
|
||||
handleResendUserMessage({ ...message, content: editedText })
|
||||
}
|
||||
|
||||
if (resendMessage) handleResendUserMessage({ ...message, content: editedText })
|
||||
}, [message, editMessage, topic, handleResendUserMessage, t])
|
||||
}, [message, editMessage, handleResendUserMessage, t])
|
||||
|
||||
const handleTranslate = useCallback(
|
||||
async (language: string) => {
|
||||
@ -238,7 +234,7 @@ const MessageMenubar: FC<Props> = (props) => {
|
||||
|
||||
const onRegenerate = async (e: React.MouseEvent | undefined) => {
|
||||
e?.stopPropagation?.()
|
||||
await modelGenerating()
|
||||
if (loading) return
|
||||
const selectedModel = isGrouped ? model : assistantModel
|
||||
const _message = resetAssistantMessage(message, selectedModel)
|
||||
editMessage(message.id, { ..._message })
|
||||
@ -247,7 +243,7 @@ const MessageMenubar: FC<Props> = (props) => {
|
||||
|
||||
const onMentionModel = async (e: React.MouseEvent) => {
|
||||
e.stopPropagation()
|
||||
await modelGenerating()
|
||||
if (loading) return
|
||||
const selectedModel = await SelectModelPopup.show({ model })
|
||||
if (!selectedModel) return
|
||||
resendMessage(message, { ...assistant, model: selectedModel }, true)
|
||||
|
||||
@ -382,10 +382,12 @@ export const resendMessage =
|
||||
if (message.role === 'user') {
|
||||
// 查找此用户消息对应的助手消息
|
||||
const assistantMessage = topicMessages.find((m) => m.role === 'assistant' && m.askId === message.id)
|
||||
|
||||
return dispatch(
|
||||
sendMessage(message, assistant, topic, {
|
||||
resendAssistantMessage: assistantMessage
|
||||
resendAssistantMessage: assistantMessage,
|
||||
// 用户可能把助手消息删了,然后重新发送用户消息
|
||||
// 如果isMentionModel为false,则只会发送add助手消息
|
||||
isMentionModel: !assistantMessage
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user