From ad814a0f4f93f32d4b7c483040dc8e6e3c70b124 Mon Sep 17 00:00:00 2001 From: L-Sun Date: Fri, 17 Jan 2025 11:29:20 +0000 Subject: [PATCH] feat(editor): add sidebar service (#9761) --- .../affine/shared/src/services/index.ts | 1 + .../shared/src/services/sidebar-service.ts | 18 ++++++++++++++++++ .../block-suite-editor/lit-adaper.tsx | 2 ++ .../specs/custom/spec-patchers.tsx | 19 +++++++++++++++++++ 4 files changed, 40 insertions(+) create mode 100644 blocksuite/affine/shared/src/services/sidebar-service.ts diff --git a/blocksuite/affine/shared/src/services/index.ts b/blocksuite/affine/shared/src/services/index.ts index 340679bad..b0f2da307 100644 --- a/blocksuite/affine/shared/src/services/index.ts +++ b/blocksuite/affine/shared/src/services/index.ts @@ -13,5 +13,6 @@ export * from './open-doc-config'; export * from './page-viewport-service'; export * from './parse-url-service'; export * from './quick-search-service'; +export * from './sidebar-service'; export * from './telemetry-service'; export * from './theme-service'; diff --git a/blocksuite/affine/shared/src/services/sidebar-service.ts b/blocksuite/affine/shared/src/services/sidebar-service.ts new file mode 100644 index 000000000..c28b3d3b2 --- /dev/null +++ b/blocksuite/affine/shared/src/services/sidebar-service.ts @@ -0,0 +1,18 @@ +import { createIdentifier } from '@blocksuite/global/di'; +import type { ExtensionType } from '@blocksuite/store'; + +export interface SidebarService { + open: (tabId?: string) => void; + close: () => void; + getTabIds: () => string[]; +} + +export const SidebarExtensionIdentifier = createIdentifier( + 'AffineSidebarExtension' +); + +export const SidebarExtension = (service: SidebarService): ExtensionType => ({ + setup: di => { + di.addImpl(SidebarExtensionIdentifier, () => service); + }, +}); diff --git a/packages/frontend/core/src/components/blocksuite/block-suite-editor/lit-adaper.tsx b/packages/frontend/core/src/components/blocksuite/block-suite-editor/lit-adaper.tsx index 1df1799df..30716d781 100644 --- a/packages/frontend/core/src/components/blocksuite/block-suite-editor/lit-adaper.tsx +++ b/packages/frontend/core/src/components/blocksuite/block-suite-editor/lit-adaper.tsx @@ -64,6 +64,7 @@ import { patchPeekViewService, patchQuickSearchService, patchReferenceRenderer, + patchSideBarService, type ReferenceReactRenderer, } from './specs/custom/spec-patchers'; import { createEdgelessModeSpecs } from './specs/edgeless'; @@ -167,6 +168,7 @@ const usePatchSpecs = (mode: DocMode) => { patched = patched.concat(patchParseDocUrlExtension(framework)); patched = patched.concat(patchGenerateDocUrlExtension(framework)); patched = patched.concat(patchQuickSearchService(framework)); + patched = patched.concat(patchSideBarService(framework)); if (BUILD_CONFIG.isMobileEdition) { patched = patched.concat(patchForMobile()); } diff --git a/packages/frontend/core/src/components/blocksuite/block-suite-editor/specs/custom/spec-patchers.tsx b/packages/frontend/core/src/components/blocksuite/block-suite-editor/specs/custom/spec-patchers.tsx index 720e17dd0..e14023662 100644 --- a/packages/frontend/core/src/components/blocksuite/block-suite-editor/specs/custom/spec-patchers.tsx +++ b/packages/frontend/core/src/components/blocksuite/block-suite-editor/specs/custom/spec-patchers.tsx @@ -24,6 +24,7 @@ import { } from '@affine/core/modules/quicksearch'; import { ExternalLinksQuickSearchSession } from '@affine/core/modules/quicksearch/impls/external-links'; import { JournalsQuickSearchSession } from '@affine/core/modules/quicksearch/impls/journals'; +import { WorkbenchService } from '@affine/core/modules/workbench'; import { WorkspaceService } from '@affine/core/modules/workspace'; import { DebugLogger } from '@affine/debug'; import { I18n } from '@affine/i18n'; @@ -61,6 +62,7 @@ import { PeekViewExtension, QuickSearchExtension, ReferenceNodeConfigExtension, + SidebarExtension, } from '@blocksuite/affine/blocks'; import { Bound } from '@blocksuite/affine/global/utils'; import { @@ -665,3 +667,20 @@ export function patchForEdgelessNoteConfig( reactToLit(), }); } + +export function patchSideBarService(framework: FrameworkProvider) { + const { workbench } = framework.get(WorkbenchService); + + return SidebarExtension({ + open: (tabId?: string) => { + workbench.openSidebar(); + workbench.activeView$.value.activeSidebarTab(tabId ?? null); + }, + close: () => { + workbench.closeSidebar(); + }, + getTabIds: () => { + return workbench.activeView$.value.sidebarTabs$.value.map(tab => tab.id); + }, + }); +}