From 39e0ec37fd7226767381065f5a3f63e98fa0177e Mon Sep 17 00:00:00 2001 From: Cats Juice Date: Tue, 15 Jul 2025 20:03:41 +0800 Subject: [PATCH] fix(core): prevent reload pinned chat infinitely (#13226) ## Summary by CodeRabbit * **Bug Fixes** * Improved chat stability by centralizing and simplifying the logic for resetting chat content, reducing unnecessary reloads and preventing infinite loading cycles. * **Refactor** * Streamlined internal chat content management for more reliable session handling and smoother user experience. --- .../desktop/pages/workspace/chat/index.tsx | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/frontend/core/src/desktop/pages/workspace/chat/index.tsx b/packages/frontend/core/src/desktop/pages/workspace/chat/index.tsx index f4bdc5c7f6..933a9f610c 100644 --- a/packages/frontend/core/src/desktop/pages/workspace/chat/index.tsx +++ b/packages/frontend/core/src/desktop/pages/workspace/chat/index.tsx @@ -148,6 +148,15 @@ export const Component = () => { } }, [client, createSession, currentSession, isTogglingPin, workspaceId]); + // remove the old content to trigger re-mount + // to avoid infinitely load and mount, should not make `chatContent` as dependency + const reMountChatContent = useCallback(() => { + setChatContent(prev => { + prev?.remove(); + return null; + }); + }, []); + const onOpenSession = useCallback( (sessionId: string) => { if (isOpeningSession) return; @@ -156,10 +165,7 @@ export const Component = () => { .getSession(workspaceId, sessionId) .then(session => { setCurrentSession(session); - if (chatContent) { - chatContent.remove(); - setChatContent(null); - } + reMountChatContent(); chatTool?.closeHistoryMenu(); }) .catch(console.error) @@ -167,7 +173,7 @@ export const Component = () => { setIsOpeningSession(false); }); }, - [chatContent, chatTool, client, isOpeningSession, workspaceId] + [chatTool, client, isOpeningSession, reMountChatContent, workspaceId] ); const onContextChange = useCallback((context: Partial) => { @@ -246,7 +252,7 @@ export const Component = () => { // init or update header ai-chat-toolbar useEffect(() => { - if (!isHeaderProvided || !chatToolContainerRef.current || !chatContent) { + if (!isHeaderProvided || !chatToolContainerRef.current) { return; } let tool = chatTool; @@ -268,8 +274,7 @@ export const Component = () => { tool.onNewSession = () => { if (!currentSession) return; setCurrentSession(null); - chatContent?.remove(); - setChatContent(null); + reMountChatContent(); }; tool.onTogglePin = async () => { @@ -291,7 +296,6 @@ export const Component = () => { setChatTool(tool); } }, [ - chatContent, chatTool, currentSession, docDisplayConfig, @@ -302,6 +306,7 @@ export const Component = () => { confirmModal, framework, status, + reMountChatContent, ]); useEffect(() => { @@ -322,8 +327,6 @@ export const Component = () => { // restore pinned session useEffect(() => { - if (!chatContent) return; - const controller = new AbortController(); const signal = controller.signal; client @@ -339,10 +342,7 @@ export const Component = () => { const session = sessions[0]; if (!session) return; setCurrentSession(session); - if (chatContent) { - chatContent.remove(); - setChatContent(null); - } + reMountChatContent(); }) .catch(console.error); @@ -350,7 +350,7 @@ export const Component = () => { return () => { controller.abort(); }; - }, [chatContent, client, workspaceId]); + }, [client, reMountChatContent, workspaceId]); const onChatContainerRef = useCallback((node: HTMLDivElement) => { if (node) {