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 {