From 46ed76ecb06e85dd3e2df4c9a43e136214a59d92 Mon Sep 17 00:00:00 2001 From: donteatfriedrice Date: Thu, 20 Mar 2025 03:14:42 +0000 Subject: [PATCH] feat(editor): add embed iframe provider excalidraw (#10997) --- .../configs/providers/excalidraw.ts | 41 +++++++++++++++++++ .../configs/providers/index.ts | 2 + .../configs/providers/miro.ts | 2 +- 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 blocksuite/affine/blocks/block-embed/src/embed-iframe-block/configs/providers/excalidraw.ts diff --git a/blocksuite/affine/blocks/block-embed/src/embed-iframe-block/configs/providers/excalidraw.ts b/blocksuite/affine/blocks/block-embed/src/embed-iframe-block/configs/providers/excalidraw.ts new file mode 100644 index 0000000000..a9f484cc03 --- /dev/null +++ b/blocksuite/affine/blocks/block-embed/src/embed-iframe-block/configs/providers/excalidraw.ts @@ -0,0 +1,41 @@ +import { EmbedIframeConfigExtension } from '../../extension/embed-iframe-config'; +import { + type EmbedIframeUrlValidationOptions, + validateEmbedIframeUrl, +} from '../../utils'; + +const EXCALIDRAW_DEFAULT_WIDTH_IN_SURFACE = 640; +const EXCALIDRAW_DEFAULT_HEIGHT_IN_SURFACE = 480; +const EXCALIDRAW_DEFAULT_HEIGHT_IN_NOTE = 480; +const EXCALIDRAW_DEFAULT_WIDTH_PERCENT = 100; + +const excalidrawUrlValidationOptions: EmbedIframeUrlValidationOptions = { + protocols: ['https:'], + hostnames: ['excalidraw.com'], +}; + +const excalidrawConfig = { + name: 'excalidraw', + match: (url: string) => + validateEmbedIframeUrl(url, excalidrawUrlValidationOptions), + buildOEmbedUrl: (url: string) => { + const match = validateEmbedIframeUrl(url, excalidrawUrlValidationOptions); + if (!match) { + return undefined; + } + return url; + }, + useOEmbedUrlDirectly: true, + options: { + widthInSurface: EXCALIDRAW_DEFAULT_WIDTH_IN_SURFACE, + heightInSurface: EXCALIDRAW_DEFAULT_HEIGHT_IN_SURFACE, + heightInNote: EXCALIDRAW_DEFAULT_HEIGHT_IN_NOTE, + widthPercent: EXCALIDRAW_DEFAULT_WIDTH_PERCENT, + allow: 'clipboard-read; clipboard-write', + style: 'border: 0; border-radius: 8px;', + allowFullscreen: true, + }, +}; + +export const ExcalidrawEmbedConfig = + EmbedIframeConfigExtension(excalidrawConfig); diff --git a/blocksuite/affine/blocks/block-embed/src/embed-iframe-block/configs/providers/index.ts b/blocksuite/affine/blocks/block-embed/src/embed-iframe-block/configs/providers/index.ts index c8d3b32158..b996b2d783 100644 --- a/blocksuite/affine/blocks/block-embed/src/embed-iframe-block/configs/providers/index.ts +++ b/blocksuite/affine/blocks/block-embed/src/embed-iframe-block/configs/providers/index.ts @@ -1,3 +1,4 @@ +import { ExcalidrawEmbedConfig } from './excalidraw'; import { GoogleDriveEmbedConfig } from './google-drive'; import { MiroEmbedConfig } from './miro'; import { SpotifyEmbedConfig } from './spotify'; @@ -6,4 +7,5 @@ export const EmbedIframeConfigExtensions = [ SpotifyEmbedConfig, GoogleDriveEmbedConfig, MiroEmbedConfig, + ExcalidrawEmbedConfig, ]; diff --git a/blocksuite/affine/blocks/block-embed/src/embed-iframe-block/configs/providers/miro.ts b/blocksuite/affine/blocks/block-embed/src/embed-iframe-block/configs/providers/miro.ts index da3f7b2ffb..c977312b44 100644 --- a/blocksuite/affine/blocks/block-embed/src/embed-iframe-block/configs/providers/miro.ts +++ b/blocksuite/affine/blocks/block-embed/src/embed-iframe-block/configs/providers/miro.ts @@ -35,7 +35,7 @@ const miroConfig = { heightInSurface: MIRO_DEFAULT_HEIGHT_IN_SURFACE, heightInNote: MIRO_DEFAULT_HEIGHT_IN_NOTE, widthPercent: MIRO_DEFAULT_WIDTH_PERCENT, - allow: 'fullscreen; clipboard-read; clipboard-write', + allow: 'clipboard-read; clipboard-write', style: 'border: 0; border-radius: 8px;', allowFullscreen: true, },