From 6df7017d2d4b8fed58429bf90ac205a1d5259fc8 Mon Sep 17 00:00:00 2001 From: "Apple\\Apple" Date: Tue, 3 Jun 2025 00:37:10 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(message):=20prevent=20histor?= =?UTF-8?q?y=20loss=20when=20editing=20messages=20with=20duplicate=20IDs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Store editing message object reference using useRef to avoid ID conflicts - Use object reference comparison first before falling back to ID matching - Apply fix to both save and cancel operations in message editing - Clear reference after edit completion to prevent stale object issues Previously, when editing imported messages that contained duplicate IDs, the findIndex operation would match the first occurrence rather than the intended message, causing conversation history truncation when saving edits. This change stores and uses object references for accurate message identification during the editing process. --- web/src/hooks/useMessageEdit.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/web/src/hooks/useMessageEdit.js b/web/src/hooks/useMessageEdit.js index 3f32f8fe..513f2b32 100644 --- a/web/src/hooks/useMessageEdit.js +++ b/web/src/hooks/useMessageEdit.js @@ -1,4 +1,4 @@ -import { useCallback, useState } from 'react'; +import { useCallback, useState, useRef } from 'react'; import { Toast, Modal } from '@douyinfe/semi-ui'; import { useTranslation } from 'react-i18next'; import { getTextContent, buildApiPayload, createLoadingAssistantMessage } from '../utils/messageUtils'; @@ -14,10 +14,12 @@ export const useMessageEdit = ( const { t } = useTranslation(); const [editingMessageId, setEditingMessageId] = useState(null); const [editValue, setEditValue] = useState(''); + const editingMessageRef = useRef(null); const handleMessageEdit = useCallback((targetMessage) => { const editableContent = getTextContent(targetMessage); setEditingMessageId(targetMessage.id); + editingMessageRef.current = targetMessage; setEditValue(editableContent); }, []); @@ -25,8 +27,11 @@ export const useMessageEdit = ( if (!editingMessageId || !editValue.trim()) return; setMessage(prevMessages => { - const messageIndex = prevMessages.findIndex(msg => msg.id === editingMessageId); - if (messageIndex === -1) return prevMessages; + let messageIndex = prevMessages.findIndex(msg => msg === editingMessageRef.current); + + if (messageIndex === -1) { + messageIndex = prevMessages.findIndex(msg => msg.id === editingMessageId); + } const targetMessage = prevMessages[messageIndex]; let newContent; @@ -82,12 +87,14 @@ export const useMessageEdit = ( }); setEditingMessageId(null); + editingMessageRef.current = null; setEditValue(''); Toast.success({ content: t('消息已更新'), duration: 2 }); }, [editingMessageId, editValue, t, inputs, parameterEnabled, sendRequest, setMessage, saveMessages]); const handleEditCancel = useCallback(() => { setEditingMessageId(null); + editingMessageRef.current = null; setEditValue(''); }, []);