From 2dacba90115ffa4731cc47ee5eca28fdbbeee34f Mon Sep 17 00:00:00 2001 From: Cats Juice Date: Fri, 11 Jul 2025 12:45:59 +0800 Subject: [PATCH] feat(core): restore pinned chat for independent chat (#13154) ## Summary by CodeRabbit * **New Features** * Improved chat session management by automatically restoring a pinned chat session when opening the workspace chat. * **Enhancements** * Added support for cancelling certain requests, improving responsiveness and user experience. * **Style** * Updated the label "AFFiNE Intelligence" to "Intelligence" in relevant UI components for a more concise display. --- packages/common/graphql/src/fetcher.ts | 5 +++ .../blocksuite/ai/provider/copilot-client.ts | 4 ++- .../src/components/root-app-sidebar/index.tsx | 2 +- .../desktop/pages/workspace/chat/index.tsx | 34 ++++++++++++++++++- 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/packages/common/graphql/src/fetcher.ts b/packages/common/graphql/src/fetcher.ts index 520f6363ed..42994e3f3a 100644 --- a/packages/common/graphql/src/fetcher.ts +++ b/packages/common/graphql/src/fetcher.ts @@ -82,6 +82,10 @@ export type RequestOptions = QueryVariablesOption & { * @default 15000 */ timeout?: number; + /** + * Abort signal + */ + signal?: AbortSignal; }; export type QueryOptions = RequestOptions & { @@ -207,6 +211,7 @@ export const gqlFetcherFactory = ( headers, body: isFormData ? body : JSON.stringify(body), timeout: options.timeout, + signal: options.signal, }) ).then(async res => { if (res.headers.get('content-type')?.startsWith('application/json')) { diff --git a/packages/frontend/core/src/blocksuite/ai/provider/copilot-client.ts b/packages/frontend/core/src/blocksuite/ai/provider/copilot-client.ts index 2866d00386..6134bfe48d 100644 --- a/packages/frontend/core/src/blocksuite/ai/provider/copilot-client.ts +++ b/packages/frontend/core/src/blocksuite/ai/provider/copilot-client.ts @@ -165,7 +165,8 @@ export class CopilotClient { docId?: string, options?: RequestOptions< typeof getCopilotSessionsQuery - >['variables']['options'] + >['variables']['options'], + signal?: AbortSignal ) { try { const res = await this.gql({ @@ -176,6 +177,7 @@ export class CopilotClient { docId, options, }, + signal, }); return res.currentUser?.copilot?.chats.edges.map(e => e.node); } catch (err) { diff --git a/packages/frontend/core/src/components/root-app-sidebar/index.tsx b/packages/frontend/core/src/components/root-app-sidebar/index.tsx index c97a178537..032e9caa90 100644 --- a/packages/frontend/core/src/components/root-app-sidebar/index.tsx +++ b/packages/frontend/core/src/components/root-app-sidebar/index.tsx @@ -98,7 +98,7 @@ const AIChatButton = () => { return ( } active={aiChatActive} to={'/chat'}> - AFFiNE Intelligence + Intelligence ); }; 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 2057b94d6f..9a4dc46bac 100644 --- a/packages/frontend/core/src/desktop/pages/workspace/chat/index.tsx +++ b/packages/frontend/core/src/desktop/pages/workspace/chat/index.tsx @@ -260,6 +260,38 @@ export const Component = () => { status, ]); + // restore pinned session + useEffect(() => { + if (!chatContent) return; + + const controller = new AbortController(); + const signal = controller.signal; + client + .getSessions( + workspaceId, + {}, + undefined, + { pinned: true, limit: 1 }, + signal + ) + .then(sessions => { + if (!Array.isArray(sessions)) return; + const session = sessions[0]; + if (!session) return; + setCurrentSession(session); + if (chatContent) { + chatContent.session = session; + chatContent.reloadSession(); + } + }) + .catch(console.error); + + // abort the request + return () => { + controller.abort(); + }; + }, [chatContent, client, workspaceId]); + const onChatContainerRef = useCallback((node: HTMLDivElement) => { if (node) { setIsBodyProvided(true); @@ -285,7 +317,7 @@ export const Component = () => { return ( <> - +