Skip to content

Commit

Permalink
fix: should differentiate between internal and external links when pa…
Browse files Browse the repository at this point in the history
…sting links (#8896)
  • Loading branch information
fundon committed Dec 9, 2024
1 parent 1d07050 commit 9996ae0
Show file tree
Hide file tree
Showing 8 changed files with 41 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -90,7 +90,7 @@ export class EmbedLinkedDocBlockComponent extends EmbedBlockComponent<EmbedLinke
this._loading = false;

// If it is a link to a block or element, the content will not be rendered.
if (this._isLinkToNode) {
if (this._referenceToNode) {
return;
}

Expand Down Expand Up @@ -121,7 +121,7 @@ export class EmbedLinkedDocBlockComponent extends EmbedBlockComponent<EmbedLinke
override _cardStyle: (typeof EmbedLinkedDocStyles)[number] = 'horizontal';

convertToEmbed = () => {
if (this._isLinkToNode) return;
if (this._referenceToNode) return;

const { doc, caption } = this.model;

Expand Down Expand Up @@ -253,7 +253,7 @@ export class EmbedLinkedDocBlockComponent extends EmbedBlockComponent<EmbedLinke
super.connectedCallback();

this._cardStyle = this.model.style;
this._isLinkToNode = isLinkToNode(this.model);
this._referenceToNode = referenceToNode(this.model);

this._load().catch(e => {
console.error(e);
Expand Down Expand Up @@ -297,7 +297,7 @@ export class EmbedLinkedDocBlockComponent extends EmbedBlockComponent<EmbedLinke
})
);

if (this._isLinkToNode) {
if (this._referenceToNode) {
this._linkedDocMode = this.model.params?.mode ?? 'page';
} else {
const docMode = this.std.get(DocModeProvider);
Expand Down Expand Up @@ -369,7 +369,7 @@ export class EmbedLinkedDocBlockComponent extends EmbedBlockComponent<EmbedLinke
? LinkedDocDeletedIcon
: this.model.title
? AliasIcon({ width: '16px', height: '16pc' })
: this._isLinkToNode
: this._referenceToNode
? BlockLinkIcon
: LinkedDocIcon;

Expand Down Expand Up @@ -516,16 +516,16 @@ export class EmbedLinkedDocBlockComponent extends EmbedBlockComponent<EmbedLinke
@state()
private accessor _docUpdatedAt: Date = new Date();

// linking block/element
@state()
private accessor _isLinkToNode = false;

@state()
private accessor _linkedDocMode: DocMode = 'page';

@state()
private accessor _loading = false;

// reference to block/element
@state()
private accessor _referenceToNode = false;

@property({ attribute: false })
accessor isBannerEmpty = false;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ export * from './reference-node/reference-config.js';

export { AffineReference } from './reference-node/reference-node.js';
export type { RefNodeSlots } from './reference-node/types.js';
export { cloneReferenceInfo, isLinkToNode } from './reference-node/utils.js';
export { cloneReferenceInfo, referenceToNode } from './reference-node/utils.js';
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ import { RefNodeSlotsProvider } from '../../../../extension/index.js';
import { affineTextStyles } from '../affine-text.js';
import { DEFAULT_DOC_NAME, REFERENCE_NODE } from '../consts.js';
import { toggleReferencePopup } from './reference-popup.js';
import { cloneReferenceInfo, isLinkToNode } from './utils.js';
import { cloneReferenceInfo, referenceToNode } from './utils.js';

@Peekable({ action: false })
export class AffineReference extends WithDisposable(ShadowlessElement) {
Expand Down Expand Up @@ -120,7 +120,7 @@ export class AffineReference extends WithDisposable(ShadowlessElement) {
return {
template: toggleReferencePopup(
this,
this.isLinkToNode(),
this.referenceToNode(),
this.referenceInfo,
this.inlineEditor,
this.selfInlineRange,
Expand Down Expand Up @@ -226,9 +226,9 @@ export class AffineReference extends WithDisposable(ShadowlessElement) {
.catch(console.error);
}

// linking to block/element
isLinkToNode() {
return isLinkToNode(this.referenceInfo);
// reference to block/element
referenceToNode() {
return referenceToNode(this.referenceInfo);
}

override render() {
Expand Down Expand Up @@ -259,7 +259,7 @@ export class AffineReference extends WithDisposable(ShadowlessElement) {
() =>
hasTitleAlias
? AliasIcon()
: this.isLinkToNode()
: this.referenceToNode()
? BlockLinkIcon
: FontLinkedDocIcon,
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
15 changes: 7 additions & 8 deletions packages/blocks/src/root-block/clipboard/middlewares/paste.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { ParagraphBlockModel } from '@blocksuite/affine-model';

import { referenceToNode } from '@blocksuite/affine-components/rich-text';
import {
ParseDocUrlProvider,
type ParseDocUrlService,
Expand Down Expand Up @@ -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;
Expand Down
37 changes: 12 additions & 25 deletions packages/blocks/src/root-block/edgeless/clipboard/clipboard.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { Connection, ReferenceParams } from '@blocksuite/affine-model';
import type { Connection } from '@blocksuite/affine-model';
import type {
BlockStdScope,
EditorHost,
Expand All @@ -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,
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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)
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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)
);
Expand Down

0 comments on commit 9996ae0

Please sign in to comment.