From 6eb34d70c1cd4472af429777fca995e3ad5f9039 Mon Sep 17 00:00:00 2001 From: donteatfriedrice Date: Mon, 17 Mar 2025 05:00:55 +0000 Subject: [PATCH] feat(editor): support bookmark block convert to embed iframe block (#10907) --- .../block-bookmark/src/configs/toolbar.ts | 75 +++++++++++++------ 1 file changed, 53 insertions(+), 22 deletions(-) diff --git a/blocksuite/affine/blocks/block-bookmark/src/configs/toolbar.ts b/blocksuite/affine/blocks/block-bookmark/src/configs/toolbar.ts index bc79a65b23..c7d7b94bf6 100644 --- a/blocksuite/affine/blocks/block-bookmark/src/configs/toolbar.ts +++ b/blocksuite/affine/blocks/block-bookmark/src/configs/toolbar.ts @@ -1,8 +1,10 @@ +import { EmbedIframeService } from '@blocksuite/affine-block-embed'; import { toast } from '@blocksuite/affine-components/toast'; import { BookmarkBlockModel } from '@blocksuite/affine-model'; import { ActionPlacement, EmbedOptionProvider, + FeatureFlagService, type ToolbarAction, type ToolbarActionGroup, type ToolbarModuleConfig, @@ -102,11 +104,21 @@ export const builtinToolbarConfig = { ); if (!model) return true; + const url = model.props.url; + // check if the url can be embedded as iframe block + const featureFlag = ctx.std.get(FeatureFlagService); + const embedIframeService = ctx.std.get(EmbedIframeService); + const isEmbedIframeEnabled = featureFlag.getFlag( + 'enable_embed_iframe_block' + ); + const canEmbedAsIframe = + isEmbedIframeEnabled && embedIframeService.canEmbed(url); + const options = ctx.std .get(EmbedOptionProvider) - .getEmbedBlockOptions(model.props.url); + .getEmbedBlockOptions(url); - return options?.viewType !== 'embed'; + return !canEmbedAsIframe && options?.viewType !== 'embed'; }, run(ctx) { const model = ctx.getCurrentModelByType( @@ -118,29 +130,48 @@ export const builtinToolbarConfig = { const { caption, url, style } = model.props; const { parent } = model; const index = parent?.children.indexOf(model); + if (!parent) return; - const options = ctx.std - .get(EmbedOptionProvider) - .getEmbedBlockOptions(url); + let blockId: string | undefined; - if (!options) return; - - const { flavour, styles } = options; - - const newStyle = styles.includes(style) - ? style - : styles.find(s => s !== 'vertical' && s !== 'cube'); - - const blockId = ctx.store.addBlock( - flavour, - { - url, - caption, - style: newStyle, - }, - parent, - index + // first try to embed as iframe block + const featureFlag = ctx.std.get(FeatureFlagService); + const isEmbedIframeEnabled = featureFlag.getFlag( + 'enable_embed_iframe_block' ); + const embedIframeService = ctx.std.get(EmbedIframeService); + if (isEmbedIframeEnabled && embedIframeService.canEmbed(url)) { + blockId = embedIframeService.addEmbedIframeBlock( + { url, caption }, + parent.id, + index + ); + } else { + const options = ctx.std + .get(EmbedOptionProvider) + .getEmbedBlockOptions(url); + + if (!options) return; + + const { flavour, styles } = options; + + const newStyle = styles.includes(style) + ? style + : styles.find(s => s !== 'vertical' && s !== 'cube'); + + blockId = ctx.store.addBlock( + flavour, + { + url, + caption, + style: newStyle, + }, + parent, + index + ); + } + + if (!blockId) return; ctx.store.deleteBlock(model);