diff --git a/src/renderer/src/hooks/useMessageOperations.ts b/src/renderer/src/hooks/useMessageOperations.ts index 40cda0213f..8cc82063b3 100644 --- a/src/renderer/src/hooks/useMessageOperations.ts +++ b/src/renderer/src/hooks/useMessageOperations.ts @@ -79,7 +79,7 @@ export function useMessageOperations(topic: Topic) { ) /** - * 编辑消息。(目前仅更新 Redux state)。 / Edits a message. (Currently only updates Redux state). + * 编辑消息。 / Edits a message. * 使用 newMessagesActions.updateMessage. */ const editMessage = useCallback( @@ -92,17 +92,12 @@ export function useMessageOperations(topic: Topic) { const messageUpdates: Partial & Pick = { id: messageId, + updatedAt: new Date().toISOString(), ...updates } // Call the thunk with topic.id and only message updates - const success = await dispatch(updateMessageAndBlocksThunk(topic.id, messageUpdates, [])) - - if (success) { - console.log(`[useMessageOperations] Successfully edited message ${messageId} properties.`) - } else { - console.error(`[useMessageOperations] Failed to edit message ${messageId} properties.`) - } + await dispatch(updateMessageAndBlocksThunk(topic.id, messageUpdates, [])) }, [dispatch, topic.id] ) @@ -133,9 +128,16 @@ export function useMessageOperations(topic: Topic) { const files = findFileBlocks(message).map((block) => block.file) const usage = await estimateUserPromptUsage({ content: editedContent, files }) + const messageUpdates: Partial & Pick = { + id: message.id, + updatedAt: new Date().toISOString(), + usage + } - await dispatch(updateMessageAndBlocksThunk(topic.id, { id: message.id, usage }, [])) - + await dispatch( + newMessagesActions.updateMessage({ topicId: topic.id, messageId: message.id, updates: messageUpdates }) + ) + // 对于message的修改会在下面的thunk中保存 await dispatch(resendUserMessageWithEditThunk(topic.id, message, mainTextBlockId, editedContent, assistant)) }, [dispatch, topic.id] @@ -313,29 +315,23 @@ export function useMessageOperations(topic: Topic) { * Uses the generalized thunk for persistence. */ const editMessageBlocks = useCallback( - // messageId?: string - async (blockUpdatesListRaw: Partial[]) => { + async (messageId: string, updates: Partial) => { if (!topic?.id) { console.error('[editMessageBlocks] Topic prop is not valid.') return } - if (!blockUpdatesListRaw || blockUpdatesListRaw.length === 0) { - console.warn('[editMessageBlocks] Received empty block updates list.') - return + + const blockUpdatesListProcessed = { + updatedAt: new Date().toISOString(), + ...updates } - const blockUpdatesListProcessed = blockUpdatesListRaw.map((update) => ({ - ...update, + const messageUpdates: Partial & Pick = { + id: messageId, updatedAt: new Date().toISOString() - })) - - const success = await dispatch(updateMessageAndBlocksThunk(topic.id, null, blockUpdatesListProcessed)) - - if (success) { - // console.log(`[useMessageOperations] Successfully processed block updates for message ${messageId}.`) - } else { - // console.error(`[useMessageOperations] Failed to process block updates for message ${messageId}.`) } + + await dispatch(updateMessageAndBlocksThunk(topic.id, messageUpdates, [blockUpdatesListProcessed])) }, [dispatch, topic.id] ) diff --git a/src/renderer/src/hooks/useTopic.ts b/src/renderer/src/hooks/useTopic.ts index 2e6d4eb724..06c5fd89ee 100644 --- a/src/renderer/src/hooks/useTopic.ts +++ b/src/renderer/src/hooks/useTopic.ts @@ -107,14 +107,6 @@ export const autoRenameTopic = async (assistant: Assistant, topicId: string) => // Convert class to object with functions since class only has static methods // 只有静态方法,没必要用class,可以export {} export const TopicManager = { - async getTopicLimit(limit: number) { - return await db.topics - .orderBy('updatedAt') // 按 updatedAt 排序(默认升序) - .reverse() // 逆序(变成降序) - .limit(limit) // 取前 10 条 - .toArray() - }, - async getTopic(id: string) { return await db.topics.get(id) }, diff --git a/src/renderer/src/pages/home/Messages/MessageHeader.tsx b/src/renderer/src/pages/home/Messages/MessageHeader.tsx index 268b28ac99..cf25fd36f1 100644 --- a/src/renderer/src/pages/home/Messages/MessageHeader.tsx +++ b/src/renderer/src/pages/home/Messages/MessageHeader.tsx @@ -102,7 +102,7 @@ const MessageHeader: FC = memo(({ assistant, model, message }) => { {username} - {dayjs(message.createdAt).format('MM/DD HH:mm')} + {dayjs(message?.updatedAt ?? message.createdAt).format('MM/DD HH:mm')} diff --git a/src/renderer/src/pages/home/Messages/MessageMenubar.tsx b/src/renderer/src/pages/home/Messages/MessageMenubar.tsx index 918bd9cf9d..8a99e491dd 100644 --- a/src/renderer/src/pages/home/Messages/MessageMenubar.tsx +++ b/src/renderer/src/pages/home/Messages/MessageMenubar.tsx @@ -164,7 +164,7 @@ const MessageMenubar: FC = (props) => { if (resendMessage) { resendUserMessageWithEdit(message, editedText, assistant) } else { - editMessageBlocks([{ ...findMainTextBlocks(message)[0], content: editedText }]) + editMessageBlocks(message.id, { id: findMainTextBlocks(message)[0].id, content: editedText }) } // // 更新消息内容,保留图片信息 // await editMessage(message.id, { diff --git a/src/renderer/src/store/thunk/messageThunk.ts b/src/renderer/src/store/thunk/messageThunk.ts index ac285298b7..866be35025 100644 --- a/src/renderer/src/store/thunk/messageThunk.ts +++ b/src/renderer/src/store/thunk/messageThunk.ts @@ -867,6 +867,7 @@ export const resendMessageThunk = const blockIdsToDelete = [...(originalMsg.blocks || [])] const resetMsg = resetAssistantMessage(originalMsg, { status: AssistantMessageStatus.PENDING, + updatedAt: new Date().toISOString(), ...(assistantMessagesToReset.length === 1 ? { model: assistant.model } : {}) }) @@ -969,7 +970,8 @@ export const regenerateAssistantResponseThunk = // 5. Reset the message entity in Redux const resetAssistantMsg = resetAssistantMessage(messageToResetEntity, { - status: AssistantMessageStatus.PENDING + status: AssistantMessageStatus.PENDING, + updatedAt: new Date().toISOString() }) dispatch( newMessagesActions.updateMessage({ diff --git a/src/renderer/src/types/newMessage.ts b/src/renderer/src/types/newMessage.ts index dd453dcbc5..a2ace22362 100644 --- a/src/renderer/src/types/newMessage.ts +++ b/src/renderer/src/types/newMessage.ts @@ -161,7 +161,7 @@ export type Message = { assistantId: string topicId: string createdAt: string - // updatedAt?: string + updatedAt?: string status: UserMessageStatus | AssistantMessageStatus // 消息元数据 diff --git a/src/renderer/src/utils/messageUtils/create.ts b/src/renderer/src/utils/messageUtils/create.ts index 12a19958a2..fdd90c3fde 100644 --- a/src/renderer/src/utils/messageUtils/create.ts +++ b/src/renderer/src/utils/messageUtils/create.ts @@ -384,7 +384,7 @@ export function resetMessage( */ export const resetAssistantMessage = ( originalMessage: Message, - updates?: Partial> // Primarily allow updating status + updates?: Partial> // Primarily allow updating status ): Message => { // Ensure we are only resetting assistant messages if (originalMessage.role !== 'assistant') {