Просмотр исходного кода

🐛fix: Fix message saving missing the last conversation

- Modify saveMessagesImmediately to accept messages parameter
- Pass updated message list to all save calls instead of relying on closure
- Ensure complete message history is saved including the last message
- Fix timing issue where old message state was being saved

This fixes the issue where the last conversation was not being persisted to localStorage.
Apple\Apple 9 месяцев назад
Родитель
Сommit
18c2e5cd98

+ 4 - 4
web/src/hooks/useApiRequest.js

@@ -115,9 +115,9 @@ export const useApiRequest = (
         }
       ];
 
-      // 在消息完成时保存
+      // 在消息完成时保存,传入更新后的消息列表
       if (status === MESSAGE_STATUS.COMPLETE || status === MESSAGE_STATUS.ERROR) {
-        setTimeout(() => saveMessages(), 0);
+        setTimeout(() => saveMessages(updatedMessages), 0);
       }
 
       return updatedMessages;
@@ -375,8 +375,8 @@ export const useApiRequest = (
             }
           ];
 
-          // 停止生成时也保存
-          setTimeout(() => saveMessages(), 0);
+          // 停止生成时也保存,传入更新后的消息列表
+          setTimeout(() => saveMessages(updatedMessages), 0);
 
           return updatedMessages;
         }

+ 4 - 4
web/src/hooks/useMessageActions.js

@@ -164,8 +164,8 @@ export const useMessageActions = (message, setMessage, onMessageSend, saveMessag
             updatedMessages = prevMessages.filter(msg => msg.id !== targetMessage.id);
           }
 
-          // 删除消息后保存
-          setTimeout(() => saveMessages(), 0);
+          // 删除消息后保存,传入更新后的消息列表
+          setTimeout(() => saveMessages(updatedMessages), 0);
           return updatedMessages;
         });
       },
@@ -189,8 +189,8 @@ export const useMessageActions = (message, setMessage, onMessageSend, saveMessag
         return msg;
       });
 
-      // 切换角色后保存
-      setTimeout(() => saveMessages(), 0);
+      // 切换角色后保存,传入更新后的消息列表
+      setTimeout(() => saveMessages(updatedMessages), 0);
       return updatedMessages;
     });
 

+ 6 - 6
web/src/hooks/useMessageEdit.js

@@ -57,8 +57,8 @@ export const useMessageEdit = (
             onOk: () => {
               const messagesUntilUser = updatedMessages.slice(0, messageIndex + 1);
               setMessage(messagesUntilUser);
-              // 编辑后保存(重新生成的情况)
-              setTimeout(() => saveMessages(), 0);
+              // 编辑后保存(重新生成的情况),传入更新后的消息列表
+              setTimeout(() => saveMessages(messagesUntilUser), 0);
 
               setTimeout(() => {
                 const payload = buildApiPayload(messagesUntilUser, null, inputs, parameterEnabled);
@@ -68,16 +68,16 @@ export const useMessageEdit = (
             },
             onCancel: () => {
               setMessage(updatedMessages);
-              // 编辑后保存(仅保存的情况)
-              setTimeout(() => saveMessages(), 0);
+              // 编辑后保存(仅保存的情况),传入更新后的消息列表
+              setTimeout(() => saveMessages(updatedMessages), 0);
             }
           });
           return prevMessages;
         }
       }
 
-      // 编辑后保存(普通情况)
-      setTimeout(() => saveMessages(), 0);
+      // 编辑后保存(普通情况),传入更新后的消息列表
+      setTimeout(() => saveMessages(updatedMessages), 0);
       return updatedMessages;
     });
 

+ 5 - 4
web/src/hooks/usePlaygroundState.js

@@ -64,9 +64,10 @@ export const usePlaygroundState = () => {
     }));
   }, []);
 
-  // 消息保存函数 - 改为立即保存
-  const saveMessagesImmediately = useCallback(() => {
-    saveMessages(message);
+  // 消息保存函数 - 改为立即保存,可以接受参数
+  const saveMessagesImmediately = useCallback((messagesToSave) => {
+    // 如果提供了参数,使用参数;否则使用当前状态
+    saveMessages(messagesToSave || message);
   }, [message]);
 
   // 配置保存
@@ -190,7 +191,7 @@ export const usePlaygroundState = () => {
     handleInputChange,
     handleParameterToggle,
     debouncedSaveConfig,
-    saveMessagesImmediately,  // 改为导出立即保存函数
+    saveMessagesImmediately,
     handleConfigImport,
     handleConfigReset,
   };

+ 8 - 7
web/src/pages/Playground/index.js

@@ -214,8 +214,8 @@ const Playground = () => {
           // 发送自定义请求体
           sendRequest(customPayload, customPayload.stream !== false);
 
-          // 发送消息后保存
-          setTimeout(() => saveMessagesImmediately(), 0);
+          // 发送消息后保存,传入新消息列表
+          setTimeout(() => saveMessagesImmediately(newMessages), 0);
 
           return newMessages;
         });
@@ -245,10 +245,11 @@ const Playground = () => {
         }, 100);
       }
 
-      // 发送消息后保存
-      setTimeout(() => saveMessagesImmediately(), 0);
+      // 发送消息后保存,传入新消息列表(包含用户消息和加载消息)
+      const messagesWithLoading = [...newMessages, loadingMessage];
+      setTimeout(() => saveMessagesImmediately(messagesWithLoading), 0);
 
-      return [...newMessages, loadingMessage];
+      return messagesWithLoading;
     });
   }
 
@@ -362,8 +363,8 @@ const Playground = () => {
   // 清空对话的处理函数
   const handleClearMessages = useCallback(() => {
     setMessage([]);
-    // 清空对话后保存
-    setTimeout(() => saveMessagesImmediately(), 0);
+    // 清空对话后保存,传入空数组
+    setTimeout(() => saveMessagesImmediately([]), 0);
   }, [setMessage, saveMessagesImmediately]);
 
   return (