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
|
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))
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user