diff --git a/packages/affine/block-embed/src/embed-linked-doc-block/embed-linked-doc-block.ts b/packages/affine/block-embed/src/embed-linked-doc-block/embed-linked-doc-block.ts index 92419094a211..d365de152bcd 100644 --- a/packages/affine/block-embed/src/embed-linked-doc-block/embed-linked-doc-block.ts +++ b/packages/affine/block-embed/src/embed-linked-doc-block/embed-linked-doc-block.ts @@ -9,8 +9,8 @@ import { BlockLinkIcon } from '@blocksuite/affine-components/icons'; import { isPeekable, Peekable } from '@blocksuite/affine-components/peek'; import { cloneReferenceInfo, - isLinkToNode, REFERENCE_NODE, + referenceToNode, RefNodeSlotsProvider, } from '@blocksuite/affine-components/rich-text'; import { @@ -90,7 +90,7 @@ export class EmbedLinkedDocBlockComponent extends EmbedBlockComponent { - if (this._isLinkToNode) return; + if (this._referenceToNode) return; const { doc, caption } = this.model; @@ -253,7 +253,7 @@ export class EmbedLinkedDocBlockComponent extends EmbedBlockComponent { console.error(e); @@ -297,7 +297,7 @@ export class EmbedLinkedDocBlockComponent extends EmbedBlockComponent hasTitleAlias ? AliasIcon() - : this.isLinkToNode() + : this.referenceToNode() ? BlockLinkIcon : FontLinkedDocIcon, ], diff --git a/packages/affine/components/src/rich-text/inline/presets/nodes/reference-node/utils.ts b/packages/affine/components/src/rich-text/inline/presets/nodes/reference-node/utils.ts index d5fea5447a24..b30fd088f3ba 100644 --- a/packages/affine/components/src/rich-text/inline/presets/nodes/reference-node/utils.ts +++ b/packages/affine/components/src/rich-text/inline/presets/nodes/reference-node/utils.ts @@ -21,7 +21,7 @@ export function cloneReferenceInfo({ /** * Returns true if it is a link to block or element. */ -export function isLinkToNode({ params }: ReferenceInfo) { +export function referenceToNode({ params }: ReferenceInfo) { if (!params) return false; if (!params.mode) return false; const { blockIds, elementIds, databaseId, databaseRowId } = params; diff --git a/packages/blocks/src/root-block/clipboard/middlewares/paste.ts b/packages/blocks/src/root-block/clipboard/middlewares/paste.ts index 75e6f4e0fa4e..d79de8038b13 100644 --- a/packages/blocks/src/root-block/clipboard/middlewares/paste.ts +++ b/packages/blocks/src/root-block/clipboard/middlewares/paste.ts @@ -1,5 +1,6 @@ import type { ParagraphBlockModel } from '@blocksuite/affine-model'; +import { referenceToNode } from '@blocksuite/affine-components/rich-text'; import { ParseDocUrlProvider, type ParseDocUrlService, @@ -409,20 +410,18 @@ class PasteTr { const pageId = needToConvert.get(op)!; const reference = { pageId, type: 'LinkedPage' }; - const extracted = extractSearchParams(link); - const isLinkToNode = Boolean( - extracted?.params?.mode && - (extracted.params.blockIds?.length || - extracted.params.elementIds?.length) - ); + const extractedParams = extractSearchParams(link); + const isLinkedBlock = extractedParams + ? referenceToNode({ pageId, ...extractedParams }) + : false; - Object.assign(reference, extracted); + Object.assign(reference, extractedParams); this.std.getOptional(TelemetryProvider)?.track('LinkedDocCreated', { page: 'doc editor', category: 'pasted link', - type: isLinkToNode ? 'block' : 'doc', other: 'existing doc', + type: isLinkedBlock ? 'block' : 'doc', }); transformed = true; diff --git a/packages/blocks/src/root-block/edgeless/clipboard/clipboard.ts b/packages/blocks/src/root-block/edgeless/clipboard/clipboard.ts index 0ea89b651c20..937ba110bb61 100644 --- a/packages/blocks/src/root-block/edgeless/clipboard/clipboard.ts +++ b/packages/blocks/src/root-block/edgeless/clipboard/clipboard.ts @@ -1,4 +1,4 @@ -import type { Connection, ReferenceParams } from '@blocksuite/affine-model'; +import type { Connection } from '@blocksuite/affine-model'; import type { BlockStdScope, EditorHost, @@ -12,6 +12,7 @@ import { SurfaceGroupLikeModel, TextUtils, } from '@blocksuite/affine-block-surface'; +import { referenceToNode } from '@blocksuite/affine-components/rich-text'; import { BookmarkStyles, DEFAULT_NOTE_HEIGHT, @@ -286,33 +287,19 @@ export class EdgelessClipboardController extends PageClipboard { let flavour = 'affine:bookmark'; let style = BookmarkStyles[0]; - let isLinkToNode = false; + let isInternalLink = false; + let isLinkedBlock = false; if (docUrlInfo) { - options.pageId = docUrlInfo.docId; + const { docId: pageId, ...params } = docUrlInfo; + flavour = 'affine:embed-linked-doc'; style = 'vertical'; - isLinkToNode = Boolean( - docUrlInfo.blockIds?.length || docUrlInfo.elementIds?.length - ); - - const params: ReferenceParams = {}; - if (docUrlInfo.mode) { - params.mode = docUrlInfo.mode; - } - if (isLinkToNode) { - if (docUrlInfo.blockIds?.length) { - params.blockIds = docUrlInfo.blockIds; - } - if (docUrlInfo.elementIds?.length) { - params.elementIds = docUrlInfo.elementIds; - } - } - - if (Object.keys(params).length) { - Object.assign(options, { params }); - } + isInternalLink = true; + isLinkedBlock = referenceToNode({ pageId, params }); + options.pageId = pageId; + if (params) options.params = params; } else { options.url = url; @@ -356,8 +343,8 @@ export class EdgelessClipboardController extends PageClipboard { page: 'whiteboard editor', segment: 'whiteboard', category: 'pasted link', - other: 'existing doc', - type: isLinkToNode ? 'block' : 'doc', + other: isInternalLink ? 'existing doc' : 'external link', + type: isInternalLink ? (isLinkedBlock ? 'block' : 'doc') : 'link', }); this.selectionManager.set({ diff --git a/packages/blocks/src/root-block/widgets/element-toolbar/change-embed-card-button.ts b/packages/blocks/src/root-block/widgets/element-toolbar/change-embed-card-button.ts index 4a40627c0daa..affb626a8245 100644 --- a/packages/blocks/src/root-block/widgets/element-toolbar/change-embed-card-button.ts +++ b/packages/blocks/src/root-block/widgets/element-toolbar/change-embed-card-button.ts @@ -11,7 +11,7 @@ import { } from '@blocksuite/affine-components/icons'; import { notifyLinkedDocSwitchedToEmbed } from '@blocksuite/affine-components/notification'; import { isPeekable, peek } from '@blocksuite/affine-components/peek'; -import { isLinkToNode } from '@blocksuite/affine-components/rich-text'; +import { referenceToNode } from '@blocksuite/affine-components/rich-text'; import { toast } from '@blocksuite/affine-components/toast'; import { type MenuItem, @@ -323,7 +323,7 @@ export class EdgelessChangeEmbedCardButton extends WithDisposable(LitElement) { } return ( isEmbedLinkedDocBlock(this.model) && - (isLinkToNode(this.model) || + (referenceToNode(this.model) || !!this._blockComponent?.closest('affine-embed-synced-doc-block') || this.model.pageId === this._doc.id) ); diff --git a/packages/blocks/src/root-block/widgets/embed-card-toolbar/embed-card-toolbar.ts b/packages/blocks/src/root-block/widgets/embed-card-toolbar/embed-card-toolbar.ts index a24eb097c757..3f92c6d80532 100644 --- a/packages/blocks/src/root-block/widgets/embed-card-toolbar/embed-card-toolbar.ts +++ b/packages/blocks/src/root-block/widgets/embed-card-toolbar/embed-card-toolbar.ts @@ -12,7 +12,7 @@ import { } from '@blocksuite/affine-components/icons'; import { notifyLinkedDocSwitchedToEmbed } from '@blocksuite/affine-components/notification'; import { isPeekable, peek } from '@blocksuite/affine-components/peek'; -import { isLinkToNode } from '@blocksuite/affine-components/rich-text'; +import { referenceToNode } from '@blocksuite/affine-components/rich-text'; import { toast } from '@blocksuite/affine-components/toast'; import { cloneGroups, @@ -126,7 +126,7 @@ export class EmbedCardToolbar extends WidgetComponent< this.focusModel && this.focusBlock && isEmbedLinkedDocBlock(this.focusModel) && - (isLinkToNode(this.focusModel) || + (referenceToNode(this.focusModel) || !!this.focusBlock.closest('affine-embed-synced-doc-block') || this.focusModel.pageId === this.doc.id) );