From f7798a00c11d4f27c64a9be3817261ae665b63ff Mon Sep 17 00:00:00 2001 From: donteatfriedrice Date: Fri, 2 Aug 2024 03:53:12 +0000 Subject: [PATCH] feat: patch edgeless clipboard to support cuntom block copy paste (#7689) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix: [BS-1005](https://linear.app/affine-design/issue/BS-1005/chat-block无法被copy-paste到别的文档中,duplicate全篇文档后,可以center-peek) related: https://github.com/toeverything/blocksuite/pull/7797 --- .../block-suite-editor/lit-adaper.tsx | 2 + .../specs/custom/spec-patchers.tsx | 57 +++++++++++++++++++ 2 files changed, 59 insertions(+) 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 f2dbf0e9d..d57bd5177 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 @@ -37,6 +37,7 @@ import { BiDirectionalLinkPanel } from './bi-directional-link-panel'; import { BlocksuiteEditorJournalDocTitle } from './journal-doc-title'; import { patchDocModeService, + patchEdgelessClipboard, patchForSharedPage, patchNotificationService, patchPeekViewService, @@ -102,6 +103,7 @@ const usePatchSpecs = (page: Doc, shared: boolean, mode: DocMode) => { confirmModal ); patched = patchPeekViewService(patched, peekViewService); + patched = patchEdgelessClipboard(patched); if (!page.readonly) { patched = patchQuickSearchService(patched, framework); } 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 f407d3cc0..1b96c9998 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 @@ -30,6 +30,8 @@ import { type RootService, } from '@blocksuite/blocks'; import { LinkIcon } from '@blocksuite/icons/rc'; +import { AIChatBlockSchema } from '@blocksuite/presets'; +import type { BlockSnapshot } from '@blocksuite/store'; import { type DocMode, type DocService, @@ -510,6 +512,61 @@ export function patchQuickSearchService( return specs; } +export function patchEdgelessClipboard(specs: BlockSpec[]) { + const rootSpec = specs.find( + spec => spec.schema.model.flavour === 'affine:page' + ) as BlockSpec; + + if (!rootSpec) { + return specs; + } + + const oldSetup = rootSpec.setup; + rootSpec.setup = (slots, disposableGroup) => { + oldSetup?.(slots, disposableGroup); + disposableGroup.add( + slots.viewConnected.on(view => { + const component = view.component; + if (component instanceof EdgelessRootBlockComponent) { + const AIChatBlockFlavour = AIChatBlockSchema.model.flavour; + const createFunc = (blocks: BlockSnapshot[]) => { + const blockIds = blocks.map(({ props }) => { + const { + xywh, + scale, + messages, + sessionId, + rootDocId, + rootWorkspaceId, + } = props; + const blockId = component.service.addBlock( + AIChatBlockFlavour, + { + xywh, + scale, + messages, + sessionId, + rootDocId, + rootWorkspaceId, + }, + component.surface.model.id + ); + return blockId; + }); + return blockIds; + }; + component.clipboardController.registerBlock( + AIChatBlockFlavour, + createFunc + ); + } + }) + ); + }; + + return specs; +} + @customElement('affine-linked-doc-ref-block') // @ts-expect-error ignore private warning for overriding _load export class LinkedDocBlockComponent extends EmbedLinkedDocBlockComponent {