From a30cfb53bf60795dab22dc4fb16d4c1f169198e2 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Sat, 15 Mar 2025 15:11:36 +0800 Subject: [PATCH] refactor: streamline message editing and enhance error handling - Removed unnecessary database update in useMessageOperations during message editing. - Improved user feedback for missing original user messages by integrating localized error messages in multiple languages. - Simplified event listener for message sending in Messages component. - Enhanced message resend logic in messages slice to ensure proper error handling and state updates. --- .../src/hooks/useMessageOperations.ts | 6 +---- src/renderer/src/i18n/locales/en-us.json | 3 ++- src/renderer/src/i18n/locales/ja-jp.json | 3 ++- src/renderer/src/i18n/locales/ru-ru.json | 3 ++- src/renderer/src/i18n/locales/zh-cn.json | 3 ++- src/renderer/src/i18n/locales/zh-tw.json | 3 ++- .../pages/home/Messages/MessageMenubar.tsx | 6 ++--- .../src/pages/home/Messages/Messages.tsx | 4 +-- src/renderer/src/store/messages.ts | 25 ++++++++++++++----- 9 files changed, 34 insertions(+), 22 deletions(-) diff --git a/src/renderer/src/hooks/useMessageOperations.ts b/src/renderer/src/hooks/useMessageOperations.ts index f62b8654..30414231 100644 --- a/src/renderer/src/hooks/useMessageOperations.ts +++ b/src/renderer/src/hooks/useMessageOperations.ts @@ -1,4 +1,3 @@ -import db from '@renderer/databases' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import store, { useAppDispatch, useAppSelector } from '@renderer/store' import { @@ -63,11 +62,8 @@ export function useMessageOperations(topic: Topic) { updates }) ) - await db.topics.update(topic.id, { - messages: messages.map((m) => (m.id === messageId ? { ...m, ...updates } : m)) - }) }, - [dispatch, messages, topic.id] + [dispatch, topic.id] ) /** diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 9fe1af34..2a2bd7e8 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -248,7 +248,8 @@ "render": { "description": "Failed to render formula. Please check if the formula format is correct", "title": "Render Error" - } + }, + "user_message_not_found": "Cannot find original user message to resend" }, "export": { "assistant": "Assistant", diff --git a/src/renderer/src/i18n/locales/ja-jp.json b/src/renderer/src/i18n/locales/ja-jp.json index 0dc1ab99..ebd3d8fe 100644 --- a/src/renderer/src/i18n/locales/ja-jp.json +++ b/src/renderer/src/i18n/locales/ja-jp.json @@ -248,7 +248,8 @@ "render": { "description": "数式のレンダリングに失敗しました。数式の形式が正しいか確認してください", "title": "レンダリングエラー" - } + }, + "user_message_not_found": "元のユーザーメッセージを見つけることができませんでした" }, "export": { "assistant": "アシスタント", diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index 915e9786..259bf36b 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -248,7 +248,8 @@ "render": { "description": "Не удалось рендерить формулу. Пожалуйста, проверьте, правильно ли формат формулы", "title": "Ошибка рендеринга" - } + }, + "user_message_not_found": "Не удалось найти исходное сообщение пользователя" }, "export": { "assistant": "Ассистент", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 05dab6d2..1c7bf0bf 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -248,7 +248,8 @@ "render": { "description": "渲染公式失败,请检查公式格式是否正确", "title": "渲染错误" - } + }, + "user_message_not_found": "无法找到原始用户消息" }, "export": { "assistant": "助手", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index 484d9891..19f6f3b4 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -248,7 +248,8 @@ "render": { "description": "渲染公式失敗,請檢查公式格式是否正確", "title": "渲染錯誤" - } + }, + "user_message_not_found": "無法找到原始用戶訊息" }, "export": { "assistant": "助手", diff --git a/src/renderer/src/pages/home/Messages/MessageMenubar.tsx b/src/renderer/src/pages/home/Messages/MessageMenubar.tsx index 78985ace..0c36556f 100644 --- a/src/renderer/src/pages/home/Messages/MessageMenubar.tsx +++ b/src/renderer/src/pages/home/Messages/MessageMenubar.tsx @@ -120,10 +120,10 @@ const MessageMenubar: FC = (props) => { ) : null } }) - if (editedText && editedText !== message.content && resendMessage) { - // 同步修改store中用户消息 + + if (editedText && editedText !== message.content) { await editMessage(message.id, { content: editedText }) - handleResendUserMessage({ ...message, content: editedText }) + resendMessage && handleResendUserMessage({ ...message, content: editedText }) } }, [message, editMessage, handleResendUserMessage, t]) diff --git a/src/renderer/src/pages/home/Messages/Messages.tsx b/src/renderer/src/pages/home/Messages/Messages.tsx index 7572dab1..eb3ecb24 100644 --- a/src/renderer/src/pages/home/Messages/Messages.tsx +++ b/src/renderer/src/pages/home/Messages/Messages.tsx @@ -68,9 +68,7 @@ const Messages: React.FC = ({ assistant, topic, setActiveTopic }) useEffect(() => { const unsubscribes = [ - EventEmitter.on(EVENT_NAMES.SEND_MESSAGE, () => { - scrollToBottom() - }), + EventEmitter.on(EVENT_NAMES.SEND_MESSAGE, scrollToBottom), EventEmitter.on(EVENT_NAMES.CLEAR_MESSAGES, async (data: Topic) => { const defaultTopic = getDefaultTopic(assistant.id) diff --git a/src/renderer/src/store/messages.ts b/src/renderer/src/store/messages.ts index 3c55efe6..2274ff11 100644 --- a/src/renderer/src/store/messages.ts +++ b/src/renderer/src/store/messages.ts @@ -1,6 +1,7 @@ import { createAsyncThunk, createSelector, createSlice, type PayloadAction } from '@reduxjs/toolkit' import db from '@renderer/databases' import { autoRenameTopic, TopicManager } from '@renderer/hooks/useTopic' +import i18n from '@renderer/i18n' import { fetchChatCompletion } from '@renderer/services/ApiService' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { getAssistantMessage, resetAssistantMessage } from '@renderer/services/MessagesService' @@ -8,7 +9,7 @@ import type { AppDispatch, RootState } from '@renderer/store' import type { Assistant, Message, Topic } from '@renderer/types' import { Model } from '@renderer/types' import { clearTopicQueue, getTopicQueue, waitForTopicQueue } from '@renderer/utils/queue' -import { throttle } from 'lodash' +import { cloneDeep, throttle } from 'lodash' export interface MessagesState { messagesByTopic: Record @@ -139,6 +140,9 @@ const messagesSlice = createSlice({ const message = topicMessages.find((msg) => msg.id === messageId) if (message) { Object.assign(message, updates) + db.topics.update(topicId, { + messages: topicMessages.map((m) => (m.id === message.id ? cloneDeep(message) : m)) + }) } } }, @@ -282,10 +286,9 @@ export const sendMessage = const messageToReset = options.resendAssistantMessage if (Array.isArray(messageToReset)) { assistantMessages = messageToReset.map((m) => { - const { model, id } = m - const resetMessage = resetAssistantMessage(m, model) + const resetMessage = resetAssistantMessage(m, assistant.model) // 更新状态 - dispatch(updateMessage({ topicId: topic.id, messageId: id, updates: resetMessage })) + dispatch(updateMessage({ topicId: topic.id, messageId: m.id, updates: resetMessage })) // 使用重置后的消息 return resetMessage }) @@ -337,10 +340,12 @@ export const sendMessage = }) ) } + for (const assistantMessage of assistantMessages) { // for of会收到await 影响,在暂停的时候会因为异步的原因有概率拿不到数据 dispatch(setStreamMessage({ topicId: topic.id, message: assistantMessage })) } + const queue = getTopicQueue(topic.id) for (const assistantMessage of assistantMessages) { @@ -469,8 +474,15 @@ export const resendMessage = // 如果是助手消息,找到对应的用户消息 const userMessage = topicMessages.find((m) => m.id === message.askId && m.role === 'user') if (!userMessage) { - console.error('Cannot find original user message to resend') - return dispatch(setError('Cannot find original user message to resend')) + dispatch( + updateMessage({ + topicId: topic.id, + messageId: message.id, + updates: { status: 'error', error: { message: i18n.t('error.user_message_not_found') } } + }) + ) + console.error(i18n.t('error.user_message_not_found')) + return dispatch(setError(i18n.t('error.user_message_not_found'))) } if (isMentionModel) { @@ -509,6 +521,7 @@ export const loadTopicMessagesThunk = (topic: Topic) => async (dispatch: AppDisp dispatch(setTopicLoading({ topicId: topic.id, loading: false })) } } + // Modified clearMessages thunk export const clearTopicMessagesThunk = (topic: Topic) => async (dispatch: AppDispatch) => { try {