diff --git a/blocksuite/affine/blocks/block-attachment/src/edgeless-clipboard-config.ts b/blocksuite/affine/blocks/block-attachment/src/edgeless-clipboard-config.ts new file mode 100644 index 000000000..96a18546a --- /dev/null +++ b/blocksuite/affine/blocks/block-attachment/src/edgeless-clipboard-config.ts @@ -0,0 +1,34 @@ +import { EdgelessClipboardConfig } from '@blocksuite/affine-block-surface'; +import { type BlockSnapshot } from '@blocksuite/store'; + +export class EdgelessClipboardAttachmentConfig extends EdgelessClipboardConfig { + static override readonly key = 'affine:attachment'; + + override async createBlock( + attachment: BlockSnapshot + ): Promise { + if (!this.surface) return null; + + const { xywh, rotate, sourceId, name, size, type, embed, style } = + attachment.props; + + if (!(await this.std.workspace.blobSync.get(sourceId as string))) { + return null; + } + const attachmentId = this.crud.addBlock( + 'affine:attachment', + { + xywh, + rotate, + sourceId, + name, + size, + type, + embed, + style, + }, + this.surface.model.id + ); + return attachmentId; + } +} diff --git a/blocksuite/affine/blocks/block-attachment/src/index.ts b/blocksuite/affine/blocks/block-attachment/src/index.ts index 0cec7006a..86842b002 100644 --- a/blocksuite/affine/blocks/block-attachment/src/index.ts +++ b/blocksuite/affine/blocks/block-attachment/src/index.ts @@ -3,6 +3,7 @@ export * from './attachment-block'; export * from './attachment-service'; export * from './attachment-spec'; export { attachmentViewDropdownMenu } from './configs/toolbar'; +export * from './edgeless-clipboard-config'; export { type AttachmentEmbedConfig, AttachmentEmbedConfigIdentifier, diff --git a/blocksuite/affine/blocks/block-bookmark/src/edgeless-clipboard-config.ts b/blocksuite/affine/blocks/block-bookmark/src/edgeless-clipboard-config.ts new file mode 100644 index 000000000..bd475f56e --- /dev/null +++ b/blocksuite/affine/blocks/block-bookmark/src/edgeless-clipboard-config.ts @@ -0,0 +1,29 @@ +import { EdgelessClipboardConfig } from '@blocksuite/affine-block-surface'; +import { type BlockSnapshot } from '@blocksuite/store'; + +export class EdgelessClipboardBookmarkConfig extends EdgelessClipboardConfig { + static override readonly key = 'affine:bookmark'; + + override createBlock(bookmark: BlockSnapshot): string | null { + if (!this.surface) return null; + + const { xywh, style, url, caption, description, icon, image, title } = + bookmark.props; + + const bookmarkId = this.crud.addBlock( + 'affine:bookmark', + { + xywh, + style, + url, + caption, + description, + icon, + image, + title, + }, + this.surface.model.id + ); + return bookmarkId; + } +} diff --git a/blocksuite/affine/blocks/block-bookmark/src/index.ts b/blocksuite/affine/blocks/block-bookmark/src/index.ts index bedb29e09..50fa7fbab 100644 --- a/blocksuite/affine/blocks/block-bookmark/src/index.ts +++ b/blocksuite/affine/blocks/block-bookmark/src/index.ts @@ -4,3 +4,4 @@ export * from './bookmark-spec'; export * from './commands'; export * from './components'; export { BookmarkSlashMenuConfigIdentifier } from './configs/slash-menu'; +export * from './edgeless-clipboard-config'; diff --git a/blocksuite/affine/blocks/block-edgeless-text/src/edgeless-clipboard-config.ts b/blocksuite/affine/blocks/block-edgeless-text/src/edgeless-clipboard-config.ts new file mode 100644 index 000000000..ec37e1713 --- /dev/null +++ b/blocksuite/affine/blocks/block-edgeless-text/src/edgeless-clipboard-config.ts @@ -0,0 +1,33 @@ +import { EdgelessClipboardConfig } from '@blocksuite/affine-block-surface'; +import { type BlockSnapshot } from '@blocksuite/store'; + +export class EdgelessClipboardEdgelessTextConfig extends EdgelessClipboardConfig { + static override readonly key = 'affine:edgeless-text'; + + override async createBlock( + edgelessText: BlockSnapshot + ): Promise { + const oldId = edgelessText.id; + delete edgelessText.props.index; + if (!edgelessText.props.xywh) { + console.error( + `EdgelessText block(id: ${oldId}) does not have xywh property` + ); + return null; + } + if (!this.surface) { + return null; + } + const newId = await this.onBlockSnapshotPaste( + edgelessText, + this.std.store, + this.surface.model.id + ); + if (!newId) { + console.error(`Failed to paste EdgelessText block(id: ${oldId})`); + return null; + } + + return newId; + } +} diff --git a/blocksuite/affine/blocks/block-edgeless-text/src/index.ts b/blocksuite/affine/blocks/block-edgeless-text/src/index.ts index 51a0887a0..5467c6e6b 100644 --- a/blocksuite/affine/blocks/block-edgeless-text/src/index.ts +++ b/blocksuite/affine/blocks/block-edgeless-text/src/index.ts @@ -1,3 +1,4 @@ +export * from './edgeless-clipboard-config'; export * from './edgeless-text-block.js'; export * from './edgeless-text-spec.js'; export * from './edgeless-toolbar'; diff --git a/blocksuite/affine/blocks/block-embed/src/embed-figma-block/edgeless-clipboard-config.ts b/blocksuite/affine/blocks/block-embed/src/embed-figma-block/edgeless-clipboard-config.ts new file mode 100644 index 000000000..155aeefb7 --- /dev/null +++ b/blocksuite/affine/blocks/block-embed/src/embed-figma-block/edgeless-clipboard-config.ts @@ -0,0 +1,25 @@ +import { EdgelessClipboardConfig } from '@blocksuite/affine-block-surface'; +import { type BlockSnapshot } from '@blocksuite/store'; + +export class EdgelessClipboardEmbedFigmaConfig extends EdgelessClipboardConfig { + static override readonly key = 'affine:embed-figma'; + + override createBlock(figmaEmbed: BlockSnapshot): string | null { + if (!this.surface) return null; + const { xywh, style, url, caption, title, description } = figmaEmbed.props; + + const embedFigmaId = this.crud.addBlock( + 'affine:embed-figma', + { + xywh, + style, + url, + caption, + title, + description, + }, + this.surface.model.id + ); + return embedFigmaId; + } +} diff --git a/blocksuite/affine/blocks/block-embed/src/embed-figma-block/index.ts b/blocksuite/affine/blocks/block-embed/src/embed-figma-block/index.ts index 392b24cd7..f96407628 100644 --- a/blocksuite/affine/blocks/block-embed/src/embed-figma-block/index.ts +++ b/blocksuite/affine/blocks/block-embed/src/embed-figma-block/index.ts @@ -1,4 +1,5 @@ export * from './adapters/index.js'; +export * from './edgeless-clipboard-config'; export * from './embed-figma-block.js'; export * from './embed-figma-model.js'; export * from './embed-figma-spec.js'; diff --git a/blocksuite/affine/blocks/block-embed/src/embed-github-block/edgeless-clipboard-config.ts b/blocksuite/affine/blocks/block-embed/src/embed-github-block/edgeless-clipboard-config.ts new file mode 100644 index 000000000..27dd5d010 --- /dev/null +++ b/blocksuite/affine/blocks/block-embed/src/embed-github-block/edgeless-clipboard-config.ts @@ -0,0 +1,51 @@ +import { EdgelessClipboardConfig } from '@blocksuite/affine-block-surface'; +import { type BlockSnapshot } from '@blocksuite/store'; + +export class EdgelessClipboardEmbedGithubConfig extends EdgelessClipboardConfig { + static override readonly key = 'affine:embed-github'; + + override createBlock(githubEmbed: BlockSnapshot): string | null { + if (!this.surface) return null; + + const { + xywh, + style, + owner, + repo, + githubType, + githubId, + url, + caption, + image, + status, + statusReason, + title, + description, + createdAt, + assignees, + } = githubEmbed.props; + + const embedGithubId = this.crud.addBlock( + 'affine:embed-github', + { + xywh, + style, + owner, + repo, + githubType, + githubId, + url, + caption, + image, + status, + statusReason, + title, + description, + createdAt, + assignees, + }, + this.surface.model.id + ); + return embedGithubId; + } +} diff --git a/blocksuite/affine/blocks/block-embed/src/embed-github-block/index.ts b/blocksuite/affine/blocks/block-embed/src/embed-github-block/index.ts index aa05ad73f..480c28227 100644 --- a/blocksuite/affine/blocks/block-embed/src/embed-github-block/index.ts +++ b/blocksuite/affine/blocks/block-embed/src/embed-github-block/index.ts @@ -1,4 +1,5 @@ export * from './adapters/index.js'; +export * from './edgeless-clipboard-config'; export * from './embed-github-block.js'; export * from './embed-github-service.js'; export * from './embed-github-spec.js'; diff --git a/blocksuite/affine/blocks/block-embed/src/embed-html-block/edgeless-clipboard-config.ts b/blocksuite/affine/blocks/block-embed/src/embed-html-block/edgeless-clipboard-config.ts new file mode 100644 index 000000000..541b38d38 --- /dev/null +++ b/blocksuite/affine/blocks/block-embed/src/embed-html-block/edgeless-clipboard-config.ts @@ -0,0 +1,24 @@ +import { EdgelessClipboardConfig } from '@blocksuite/affine-block-surface'; +import { type BlockSnapshot } from '@blocksuite/store'; + +export class EdgelessClipboardEmbedHtmlConfig extends EdgelessClipboardConfig { + static override readonly key = 'affine:embed-html'; + + override createBlock(htmlEmbed: BlockSnapshot): string | null { + if (!this.surface) return null; + const { xywh, style, caption, html, design } = htmlEmbed.props; + + const embedHtmlId = this.crud.addBlock( + 'affine:embed-html', + { + xywh, + style, + caption, + html, + design, + }, + this.surface.model.id + ); + return embedHtmlId; + } +} diff --git a/blocksuite/affine/blocks/block-embed/src/embed-html-block/index.ts b/blocksuite/affine/blocks/block-embed/src/embed-html-block/index.ts index a444319fd..9c4953134 100644 --- a/blocksuite/affine/blocks/block-embed/src/embed-html-block/index.ts +++ b/blocksuite/affine/blocks/block-embed/src/embed-html-block/index.ts @@ -1,3 +1,4 @@ +export * from './edgeless-clipboard-config'; export * from './embed-html-block.js'; export * from './embed-html-spec.js'; export { diff --git a/blocksuite/affine/blocks/block-embed/src/embed-iframe-block/edgeless-clipboard-config.ts b/blocksuite/affine/blocks/block-embed/src/embed-iframe-block/edgeless-clipboard-config.ts new file mode 100644 index 000000000..715d7c8e2 --- /dev/null +++ b/blocksuite/affine/blocks/block-embed/src/embed-iframe-block/edgeless-clipboard-config.ts @@ -0,0 +1,37 @@ +import { EdgelessClipboardConfig } from '@blocksuite/affine-block-surface'; +import { type BlockSnapshot } from '@blocksuite/store'; + +export class EdgelessClipboardEmbedIframeConfig extends EdgelessClipboardConfig { + static override readonly key = 'affine:embed-iframe'; + + override createBlock(embedIframe: BlockSnapshot): string | null { + if (!this.surface) return null; + const { + xywh, + caption, + url, + title, + description, + iframeUrl, + scale, + width, + height, + } = embedIframe.props; + + return this.crud.addBlock( + 'affine:embed-iframe', + { + url, + iframeUrl, + xywh, + caption, + title, + description, + scale, + width, + height, + }, + this.surface.model.id + ); + } +} diff --git a/blocksuite/affine/blocks/block-embed/src/embed-iframe-block/index.ts b/blocksuite/affine/blocks/block-embed/src/embed-iframe-block/index.ts index 26df09072..d58632dcf 100644 --- a/blocksuite/affine/blocks/block-embed/src/embed-iframe-block/index.ts +++ b/blocksuite/affine/blocks/block-embed/src/embed-iframe-block/index.ts @@ -5,6 +5,7 @@ export { EMBED_IFRAME_DEFAULT_HEIGHT_IN_SURFACE, EMBED_IFRAME_DEFAULT_WIDTH_IN_SURFACE, } from './consts'; +export * from './edgeless-clipboard-config'; export * from './embed-iframe-block'; export * from './embed-iframe-spec'; export { canEmbedAsIframe } from './utils'; diff --git a/blocksuite/affine/blocks/block-embed/src/embed-linked-doc-block/edgeless-clipboard-config.ts b/blocksuite/affine/blocks/block-embed/src/embed-linked-doc-block/edgeless-clipboard-config.ts new file mode 100644 index 000000000..48e3ffeda --- /dev/null +++ b/blocksuite/affine/blocks/block-embed/src/embed-linked-doc-block/edgeless-clipboard-config.ts @@ -0,0 +1,31 @@ +import { EdgelessClipboardConfig } from '@blocksuite/affine-block-surface'; +import { ReferenceInfoSchema } from '@blocksuite/affine-model'; +import { type BlockSnapshot } from '@blocksuite/store'; + +export class EdgelessClipboardEmbedLinkedDocConfig extends EdgelessClipboardConfig { + static override readonly key = 'affine:embed-linked-doc'; + + override createBlock(linkedDocEmbed: BlockSnapshot): string | null { + if (!this.surface) return null; + + const { xywh, style, caption, pageId, params, title, description } = + linkedDocEmbed.props; + const referenceInfo = ReferenceInfoSchema.parse({ + pageId, + params, + title, + description, + }); + + return this.crud.addBlock( + 'affine:embed-linked-doc', + { + xywh, + style, + caption, + ...referenceInfo, + }, + this.surface.model.id + ); + } +} diff --git a/blocksuite/affine/blocks/block-embed/src/embed-linked-doc-block/index.ts b/blocksuite/affine/blocks/block-embed/src/embed-linked-doc-block/index.ts index d4ac00bea..9b63e4068 100644 --- a/blocksuite/affine/blocks/block-embed/src/embed-linked-doc-block/index.ts +++ b/blocksuite/affine/blocks/block-embed/src/embed-linked-doc-block/index.ts @@ -1,5 +1,6 @@ export * from './adapters'; export * from './commands'; export { LinkedDocSlashMenuConfigIdentifier } from './configs/slash-menu'; +export * from './edgeless-clipboard-config'; export * from './embed-linked-doc-block'; export * from './embed-linked-doc-spec'; diff --git a/blocksuite/affine/blocks/block-embed/src/embed-loom-block/edgeless-clipboard-config.ts b/blocksuite/affine/blocks/block-embed/src/embed-loom-block/edgeless-clipboard-config.ts new file mode 100644 index 000000000..63b98722b --- /dev/null +++ b/blocksuite/affine/blocks/block-embed/src/embed-loom-block/edgeless-clipboard-config.ts @@ -0,0 +1,28 @@ +import { EdgelessClipboardConfig } from '@blocksuite/affine-block-surface'; +import { type BlockSnapshot } from '@blocksuite/store'; + +export class EdgelessClipboardEmbedLoomConfig extends EdgelessClipboardConfig { + static override readonly key = 'affine:embed-loom'; + + override createBlock(loomEmbed: BlockSnapshot): string | null { + if (!this.surface) return null; + const { xywh, style, url, caption, videoId, image, title, description } = + loomEmbed.props; + + const embedLoomId = this.crud.addBlock( + 'affine:embed-loom', + { + xywh, + style, + url, + caption, + videoId, + image, + title, + description, + }, + this.surface.model.id + ); + return embedLoomId; + } +} diff --git a/blocksuite/affine/blocks/block-embed/src/embed-loom-block/index.ts b/blocksuite/affine/blocks/block-embed/src/embed-loom-block/index.ts index 5c297a7b7..433da7b99 100644 --- a/blocksuite/affine/blocks/block-embed/src/embed-loom-block/index.ts +++ b/blocksuite/affine/blocks/block-embed/src/embed-loom-block/index.ts @@ -1,4 +1,5 @@ export * from './adapters/index.js'; +export * from './edgeless-clipboard-config'; export * from './embed-loom-block.js'; export * from './embed-loom-model.js'; export * from './embed-loom-service.js'; diff --git a/blocksuite/affine/blocks/block-embed/src/embed-synced-doc-block/edgeless-clipboard-config.ts b/blocksuite/affine/blocks/block-embed/src/embed-synced-doc-block/edgeless-clipboard-config.ts new file mode 100644 index 000000000..2ff9ee4e4 --- /dev/null +++ b/blocksuite/affine/blocks/block-embed/src/embed-synced-doc-block/edgeless-clipboard-config.ts @@ -0,0 +1,27 @@ +import { EdgelessClipboardConfig } from '@blocksuite/affine-block-surface'; +import { ReferenceInfoSchema } from '@blocksuite/affine-model'; +import { type BlockSnapshot } from '@blocksuite/store'; + +export class EdgelessClipboardEmbedSyncedDocConfig extends EdgelessClipboardConfig { + static override readonly key = 'affine:embed-synced-doc'; + + override createBlock(syncedDocEmbed: BlockSnapshot): string | null { + if (!this.surface) return null; + + const { xywh, style, caption, scale, pageId, params } = + syncedDocEmbed.props; + const referenceInfo = ReferenceInfoSchema.parse({ pageId, params }); + + return this.crud.addBlock( + 'affine:embed-synced-doc', + { + xywh, + style, + caption, + scale, + ...referenceInfo, + }, + this.surface.model.id + ); + } +} diff --git a/blocksuite/affine/blocks/block-embed/src/embed-synced-doc-block/index.ts b/blocksuite/affine/blocks/block-embed/src/embed-synced-doc-block/index.ts index 28311f413..37c3e96e4 100644 --- a/blocksuite/affine/blocks/block-embed/src/embed-synced-doc-block/index.ts +++ b/blocksuite/affine/blocks/block-embed/src/embed-synced-doc-block/index.ts @@ -1,4 +1,5 @@ export * from './adapters/index.js'; +export * from './edgeless-clipboard-config'; export * from './embed-synced-doc-block.js'; export * from './embed-synced-doc-spec.js'; export { SYNCED_MIN_HEIGHT, SYNCED_MIN_WIDTH } from './styles.js'; diff --git a/blocksuite/affine/blocks/block-embed/src/embed-youtube-block/edgeless-clipboard-config.ts b/blocksuite/affine/blocks/block-embed/src/embed-youtube-block/edgeless-clipboard-config.ts new file mode 100644 index 000000000..2d93d35e2 --- /dev/null +++ b/blocksuite/affine/blocks/block-embed/src/embed-youtube-block/edgeless-clipboard-config.ts @@ -0,0 +1,42 @@ +import { EdgelessClipboardConfig } from '@blocksuite/affine-block-surface'; +import { type BlockSnapshot } from '@blocksuite/store'; + +export class EdgelessClipboardEmbedYoutubeConfig extends EdgelessClipboardConfig { + static override readonly key = 'affine:embed-youtube'; + + override createBlock(youtubeEmbed: BlockSnapshot): string | null { + if (!this.surface) return null; + const { + xywh, + style, + url, + caption, + videoId, + image, + title, + description, + creator, + creatorUrl, + creatorImage, + } = youtubeEmbed.props; + + const embedYoutubeId = this.crud.addBlock( + 'affine:embed-youtube', + { + xywh, + style, + url, + caption, + videoId, + image, + title, + description, + creator, + creatorUrl, + creatorImage, + }, + this.surface.model.id + ); + return embedYoutubeId; + } +} diff --git a/blocksuite/affine/blocks/block-embed/src/embed-youtube-block/index.ts b/blocksuite/affine/blocks/block-embed/src/embed-youtube-block/index.ts index 5d4434400..e4108c50e 100644 --- a/blocksuite/affine/blocks/block-embed/src/embed-youtube-block/index.ts +++ b/blocksuite/affine/blocks/block-embed/src/embed-youtube-block/index.ts @@ -1,4 +1,5 @@ export * from './adapters/index.js'; +export * from './edgeless-clipboard-config'; export * from './embed-youtube-block.js'; export * from './embed-youtube-model.js'; export * from './embed-youtube-service.js'; diff --git a/blocksuite/affine/blocks/block-frame/src/edgeless-clipboard-config.ts b/blocksuite/affine/blocks/block-frame/src/edgeless-clipboard-config.ts new file mode 100644 index 000000000..91e7f666d --- /dev/null +++ b/blocksuite/affine/blocks/block-frame/src/edgeless-clipboard-config.ts @@ -0,0 +1,43 @@ +import { + type ClipboardConfigCreationContext, + EdgelessClipboardConfig, +} from '@blocksuite/affine-block-surface'; +import { type BlockSnapshot, fromJSON } from '@blocksuite/store'; + +export class EdgelessClipboardFrameConfig extends EdgelessClipboardConfig { + static override readonly key = 'affine:frame'; + + override createBlock( + frame: BlockSnapshot, + context: ClipboardConfigCreationContext + ): string | null { + if (!this.surface) return null; + + const { oldToNewIdMap, newPresentationIndexes } = context; + const { xywh, title, background, childElementIds } = frame.props; + + const newChildElementIds: Record = {}; + + if (typeof childElementIds === 'object' && childElementIds !== null) { + Object.keys(childElementIds).forEach(oldId => { + const newId = oldToNewIdMap.get(oldId); + if (newId) { + newChildElementIds[newId] = true; + } + }); + } + + const frameId = this.crud.addBlock( + 'affine:frame', + { + xywh, + background, + title: fromJSON(title), + childElementIds: newChildElementIds, + presentationIndex: newPresentationIndexes.get(frame.id), + }, + this.surface.model.id + ); + return frameId; + } +} diff --git a/blocksuite/affine/blocks/block-frame/src/index.ts b/blocksuite/affine/blocks/block-frame/src/index.ts index 404352994..9cc10f058 100644 --- a/blocksuite/affine/blocks/block-frame/src/index.ts +++ b/blocksuite/affine/blocks/block-frame/src/index.ts @@ -1,6 +1,7 @@ import type { FrameTool } from './frame-tool'; import type { PresentTool, PresentToolOption } from './preset-tool'; +export * from './edgeless-clipboard-config'; export * from './edgeless-toolbar'; export * from './frame-block'; export * from './frame-highlight-manager'; diff --git a/blocksuite/affine/blocks/block-image/src/edgeless-clipboard-config.ts b/blocksuite/affine/blocks/block-image/src/edgeless-clipboard-config.ts new file mode 100644 index 000000000..429a237d4 --- /dev/null +++ b/blocksuite/affine/blocks/block-image/src/edgeless-clipboard-config.ts @@ -0,0 +1,30 @@ +import { EdgelessClipboardConfig } from '@blocksuite/affine-block-surface'; +import { type BlockSnapshot } from '@blocksuite/store'; + +export class EdgelessClipboardImageConfig extends EdgelessClipboardConfig { + static override readonly key = 'affine:image'; + + override async createBlock(image: BlockSnapshot) { + const { xywh, rotate, sourceId, size, width, height, caption } = + image.props; + + if (!this.surface) return null; + + if (!(await this.std.workspace.blobSync.get(sourceId as string))) { + return null; + } + return this.crud.addBlock( + 'affine:image', + { + caption, + sourceId, + xywh, + rotate, + size, + width, + height, + }, + this.surface.model.id + ); + } +} diff --git a/blocksuite/affine/blocks/block-image/src/index.ts b/blocksuite/affine/blocks/block-image/src/index.ts index 808a4d44e..04d685796 100644 --- a/blocksuite/affine/blocks/block-image/src/index.ts +++ b/blocksuite/affine/blocks/block-image/src/index.ts @@ -1,5 +1,6 @@ export * from './adapters'; export * from './commands'; +export * from './edgeless-clipboard-config'; export * from './image-block'; export * from './image-edgeless-block'; export { ImageProxyService } from './image-proxy-service'; diff --git a/blocksuite/affine/blocks/block-note/src/edgeless-clipboard-config.ts b/blocksuite/affine/blocks/block-note/src/edgeless-clipboard-config.ts new file mode 100644 index 000000000..cad3a1980 --- /dev/null +++ b/blocksuite/affine/blocks/block-note/src/edgeless-clipboard-config.ts @@ -0,0 +1,28 @@ +import { EdgelessClipboardConfig } from '@blocksuite/affine-block-surface'; +import { type BlockSnapshot } from '@blocksuite/store'; + +export class EdgelessClipboardNoteConfig extends EdgelessClipboardConfig { + static override readonly key = 'affine:note'; + + override async createBlock(note: BlockSnapshot): Promise { + const oldId = note.id; + + delete note.props.index; + if (!note.props.xywh) { + console.error(`Note block(id: ${oldId}) does not have xywh property`); + return null; + } + + const newId = await this.onBlockSnapshotPaste( + note, + this.std.store, + this.std.store.root!.id + ); + if (!newId) { + console.error(`Failed to paste note block(id: ${oldId})`); + return null; + } + + return newId; + } +} diff --git a/blocksuite/affine/blocks/block-note/src/index.ts b/blocksuite/affine/blocks/block-note/src/index.ts index fb54f9e98..2bb0100eb 100644 --- a/blocksuite/affine/blocks/block-note/src/index.ts +++ b/blocksuite/affine/blocks/block-note/src/index.ts @@ -2,6 +2,7 @@ export * from './adapters'; export * from './commands'; export * from './components/edgeless-note-background'; export * from './config'; +export * from './edgeless-clipboard-config'; export * from './note-block'; export * from './note-edgeless-block'; export * from './note-spec'; diff --git a/blocksuite/affine/blocks/block-root/src/edgeless/clipboard/config.ts b/blocksuite/affine/blocks/block-root/src/edgeless/clipboard/config.ts deleted file mode 100644 index cd4d0a340..000000000 --- a/blocksuite/affine/blocks/block-root/src/edgeless/clipboard/config.ts +++ /dev/null @@ -1,435 +0,0 @@ -import { - type ClipboardConfigCreationContext, - EdgelessClipboardConfig, -} from '@blocksuite/affine-block-surface'; -import { ReferenceInfoSchema } from '@blocksuite/affine-model'; -import { type BlockSnapshot, fromJSON } from '@blocksuite/store'; - -export class EdgelessClipboardNoteConfig extends EdgelessClipboardConfig { - static override readonly key = 'affine:note'; - - override async createBlock(note: BlockSnapshot): Promise { - const oldId = note.id; - - delete note.props.index; - if (!note.props.xywh) { - console.error(`Note block(id: ${oldId}) does not have xywh property`); - return null; - } - - const newId = await this.onBlockSnapshotPaste( - note, - this.std.store, - this.std.store.root!.id - ); - if (!newId) { - console.error(`Failed to paste note block(id: ${oldId})`); - return null; - } - - return newId; - } -} - -export class EdgelessClipboardEdgelessTextConfig extends EdgelessClipboardConfig { - static override readonly key = 'affine:edgeless-text'; - - override async createBlock( - edgelessText: BlockSnapshot - ): Promise { - const oldId = edgelessText.id; - delete edgelessText.props.index; - if (!edgelessText.props.xywh) { - console.error( - `EdgelessText block(id: ${oldId}) does not have xywh property` - ); - return null; - } - if (!this.surface) { - return null; - } - const newId = await this.onBlockSnapshotPaste( - edgelessText, - this.std.store, - this.surface.model.id - ); - if (!newId) { - console.error(`Failed to paste EdgelessText block(id: ${oldId})`); - return null; - } - - return newId; - } -} - -export class EdgelessClipboardImageConfig extends EdgelessClipboardConfig { - static override readonly key = 'affine:image'; - - override async createBlock(image: BlockSnapshot) { - const { xywh, rotate, sourceId, size, width, height, caption } = - image.props; - - if (!this.surface) return null; - - if (!(await this.std.workspace.blobSync.get(sourceId as string))) { - return null; - } - return this.crud.addBlock( - 'affine:image', - { - caption, - sourceId, - xywh, - rotate, - size, - width, - height, - }, - this.surface.model.id - ); - } -} - -export class EdgelessClipboardFrameConfig extends EdgelessClipboardConfig { - static override readonly key = 'affine:frame'; - - override createBlock( - frame: BlockSnapshot, - context: ClipboardConfigCreationContext - ): string | null { - if (!this.surface) return null; - - const { oldToNewIdMap, newPresentationIndexes } = context; - const { xywh, title, background, childElementIds } = frame.props; - - const newChildElementIds: Record = {}; - - if (typeof childElementIds === 'object' && childElementIds !== null) { - Object.keys(childElementIds).forEach(oldId => { - const newId = oldToNewIdMap.get(oldId); - if (newId) { - newChildElementIds[newId] = true; - } - }); - } - - const frameId = this.crud.addBlock( - 'affine:frame', - { - xywh, - background, - title: fromJSON(title), - childElementIds: newChildElementIds, - presentationIndex: newPresentationIndexes.get(frame.id), - }, - this.surface.model.id - ); - return frameId; - } -} - -export class EdgelessClipboardAttachmentConfig extends EdgelessClipboardConfig { - static override readonly key = 'affine:attachment'; - - override async createBlock( - attachment: BlockSnapshot - ): Promise { - if (!this.surface) return null; - - const { xywh, rotate, sourceId, name, size, type, embed, style } = - attachment.props; - - if (!(await this.std.workspace.blobSync.get(sourceId as string))) { - return null; - } - const attachmentId = this.crud.addBlock( - 'affine:attachment', - { - xywh, - rotate, - sourceId, - name, - size, - type, - embed, - style, - }, - this.surface.model.id - ); - return attachmentId; - } -} - -export class EdgelessClipboardBookmarkConfig extends EdgelessClipboardConfig { - static override readonly key = 'affine:bookmark'; - - override createBlock(bookmark: BlockSnapshot): string | null { - if (!this.surface) return null; - - const { xywh, style, url, caption, description, icon, image, title } = - bookmark.props; - - const bookmarkId = this.crud.addBlock( - 'affine:bookmark', - { - xywh, - style, - url, - caption, - description, - icon, - image, - title, - }, - this.surface.model.id - ); - return bookmarkId; - } -} - -export class EdgelessClipboardEmbedFigmaConfig extends EdgelessClipboardConfig { - static override readonly key = 'affine:embed-figma'; - - override createBlock(figmaEmbed: BlockSnapshot): string | null { - if (!this.surface) return null; - const { xywh, style, url, caption, title, description } = figmaEmbed.props; - - const embedFigmaId = this.crud.addBlock( - 'affine:embed-figma', - { - xywh, - style, - url, - caption, - title, - description, - }, - this.surface.model.id - ); - return embedFigmaId; - } -} - -export class EdgelessClipboardEmbedGithubConfig extends EdgelessClipboardConfig { - static override readonly key = 'affine:embed-github'; - - override createBlock(githubEmbed: BlockSnapshot): string | null { - if (!this.surface) return null; - - const { - xywh, - style, - owner, - repo, - githubType, - githubId, - url, - caption, - image, - status, - statusReason, - title, - description, - createdAt, - assignees, - } = githubEmbed.props; - - const embedGithubId = this.crud.addBlock( - 'affine:embed-github', - { - xywh, - style, - owner, - repo, - githubType, - githubId, - url, - caption, - image, - status, - statusReason, - title, - description, - createdAt, - assignees, - }, - this.surface.model.id - ); - return embedGithubId; - } -} - -export class EdgelessClipboardEmbedHtmlConfig extends EdgelessClipboardConfig { - static override readonly key = 'affine:embed-html'; - - override createBlock(htmlEmbed: BlockSnapshot): string | null { - if (!this.surface) return null; - const { xywh, style, caption, html, design } = htmlEmbed.props; - - const embedHtmlId = this.crud.addBlock( - 'affine:embed-html', - { - xywh, - style, - caption, - html, - design, - }, - this.surface.model.id - ); - return embedHtmlId; - } -} - -export class EdgelessClipboardEmbedLoomConfig extends EdgelessClipboardConfig { - static override readonly key = 'affine:embed-loom'; - - override createBlock(loomEmbed: BlockSnapshot): string | null { - if (!this.surface) return null; - const { xywh, style, url, caption, videoId, image, title, description } = - loomEmbed.props; - - const embedLoomId = this.crud.addBlock( - 'affine:embed-loom', - { - xywh, - style, - url, - caption, - videoId, - image, - title, - description, - }, - this.surface.model.id - ); - return embedLoomId; - } -} - -export class EdgelessClipboardEmbedYoutubeConfig extends EdgelessClipboardConfig { - static override readonly key = 'affine:embed-youtube'; - - override createBlock(youtubeEmbed: BlockSnapshot): string | null { - if (!this.surface) return null; - const { - xywh, - style, - url, - caption, - videoId, - image, - title, - description, - creator, - creatorUrl, - creatorImage, - } = youtubeEmbed.props; - - const embedYoutubeId = this.crud.addBlock( - 'affine:embed-youtube', - { - xywh, - style, - url, - caption, - videoId, - image, - title, - description, - creator, - creatorUrl, - creatorImage, - }, - this.surface.model.id - ); - return embedYoutubeId; - } -} - -export class EdgelessClipboardEmbedIframeConfig extends EdgelessClipboardConfig { - static override readonly key = 'affine:embed-iframe'; - - override createBlock(embedIframe: BlockSnapshot): string | null { - if (!this.surface) return null; - const { - xywh, - caption, - url, - title, - description, - iframeUrl, - scale, - width, - height, - } = embedIframe.props; - - return this.crud.addBlock( - 'affine:embed-iframe', - { - url, - iframeUrl, - xywh, - caption, - title, - description, - scale, - width, - height, - }, - this.surface.model.id - ); - } -} - -export class EdgelessClipboardEmbedLinkedDocConfig extends EdgelessClipboardConfig { - static override readonly key = 'affine:embed-linked-doc'; - - override createBlock(linkedDocEmbed: BlockSnapshot): string | null { - if (!this.surface) return null; - - const { xywh, style, caption, pageId, params, title, description } = - linkedDocEmbed.props; - const referenceInfo = ReferenceInfoSchema.parse({ - pageId, - params, - title, - description, - }); - - return this.crud.addBlock( - 'affine:embed-linked-doc', - { - xywh, - style, - caption, - ...referenceInfo, - }, - this.surface.model.id - ); - } -} - -export class EdgelessClipboardEmbedSyncedDocConfig extends EdgelessClipboardConfig { - static override readonly key = 'affine:embed-synced-doc'; - - override createBlock(syncedDocEmbed: BlockSnapshot): string | null { - if (!this.surface) return null; - - const { xywh, style, caption, scale, pageId, params } = - syncedDocEmbed.props; - const referenceInfo = ReferenceInfoSchema.parse({ pageId, params }); - - return this.crud.addBlock( - 'affine:embed-synced-doc', - { - xywh, - style, - caption, - scale, - ...referenceInfo, - }, - this.surface.model.id - ); - } -} diff --git a/blocksuite/affine/blocks/block-root/src/edgeless/edgeless-root-spec.ts b/blocksuite/affine/blocks/block-root/src/edgeless/edgeless-root-spec.ts index 770f5e1af..88950ff95 100644 --- a/blocksuite/affine/blocks/block-root/src/edgeless/edgeless-root-spec.ts +++ b/blocksuite/affine/blocks/block-root/src/edgeless/edgeless-root-spec.ts @@ -1,3 +1,19 @@ +import { EdgelessClipboardAttachmentConfig } from '@blocksuite/affine-block-attachment'; +import { EdgelessClipboardBookmarkConfig } from '@blocksuite/affine-block-bookmark'; +import { EdgelessClipboardEdgelessTextConfig } from '@blocksuite/affine-block-edgeless-text'; +import { + EdgelessClipboardEmbedFigmaConfig, + EdgelessClipboardEmbedGithubConfig, + EdgelessClipboardEmbedHtmlConfig, + EdgelessClipboardEmbedIframeConfig, + EdgelessClipboardEmbedLinkedDocConfig, + EdgelessClipboardEmbedLoomConfig, + EdgelessClipboardEmbedSyncedDocConfig, + EdgelessClipboardEmbedYoutubeConfig, +} from '@blocksuite/affine-block-embed'; +import { EdgelessClipboardFrameConfig } from '@blocksuite/affine-block-frame'; +import { EdgelessClipboardImageConfig } from '@blocksuite/affine-block-image'; +import { EdgelessClipboardNoteConfig } from '@blocksuite/affine-block-note'; import { ViewportElementExtension } from '@blocksuite/affine-shared/services'; import { autoConnectWidget } from '@blocksuite/affine-widget-edgeless-auto-connect'; import { edgelessToolbarWidget } from '@blocksuite/affine-widget-edgeless-toolbar'; @@ -16,22 +32,6 @@ import { CommonSpecs } from '../common-specs/index.js'; import { edgelessNavigatorBgWidget } from '../widgets/edgeless-navigator-bg/index.js'; import { AFFINE_EDGELESS_ZOOM_TOOLBAR_WIDGET } from '../widgets/edgeless-zoom-toolbar/index.js'; import { EdgelessClipboardController } from './clipboard/clipboard.js'; -import { - EdgelessClipboardAttachmentConfig, - EdgelessClipboardBookmarkConfig, - EdgelessClipboardEdgelessTextConfig, - EdgelessClipboardEmbedFigmaConfig, - EdgelessClipboardEmbedGithubConfig, - EdgelessClipboardEmbedHtmlConfig, - EdgelessClipboardEmbedIframeConfig, - EdgelessClipboardEmbedLinkedDocConfig, - EdgelessClipboardEmbedLoomConfig, - EdgelessClipboardEmbedSyncedDocConfig, - EdgelessClipboardEmbedYoutubeConfig, - EdgelessClipboardFrameConfig, - EdgelessClipboardImageConfig, - EdgelessClipboardNoteConfig, -} from './clipboard/config.js'; import { NOTE_SLICER_WIDGET } from './components/note-slicer/index.js'; import { EDGELESS_DRAGGING_AREA_WIDGET } from './components/rects/edgeless-dragging-area-rect.js'; import { EDGELESS_SELECTED_RECT_WIDGET } from './components/rects/edgeless-selected-rect.js';