From cbfe38b189a5b1f56be8e3c5332e05dd3a78e343 Mon Sep 17 00:00:00 2001 From: Saul-Mirone Date: Fri, 27 Dec 2024 12:32:43 +0000 Subject: [PATCH] refactor(editor): add middlewares in shared adapter (#9395) --- .../embed-linked-doc-block.ts | 6 +- .../embed-synced-doc-block.ts | 6 +- .../rich-text/inline/presets/nodes/index.ts | 1 - .../reference-node/reference-alias-popup.ts | 2 +- .../nodes/reference-node/reference-node.ts | 5 +- .../components/src/rich-text/linked-node.ts | 4 +- .../affine/shared/src/adapters/index.ts | 1 + .../shared/src/adapters}/middlewares/copy.ts | 10 +++- .../shared/src/adapters/middlewares/index.ts | 2 + .../shared/src/adapters}/middlewares/paste.ts | 60 +++++++++++++++---- blocksuite/affine/shared/src/consts/index.ts | 1 + .../consts.ts => shared/src/consts/text.ts} | 0 blocksuite/blocks/src/_common/utils/url.ts | 42 ------------- .../blocks/src/code-block/clipboard/index.ts | 3 +- .../blocks/src/code-block/code-block.ts | 11 ++-- .../detail-panel/note-renderer.ts | 2 +- .../blocks/src/root-block/clipboard/index.ts | 3 +- .../root-block/clipboard/middlewares/index.ts | 2 - .../widgets/keyboard-toolbar/config.ts | 2 +- .../root-block/widgets/slash-menu/config.ts | 2 +- 20 files changed, 85 insertions(+), 80 deletions(-) rename blocksuite/{blocks/src/root-block/clipboard => affine/shared/src/adapters}/middlewares/copy.ts (85%) create mode 100644 blocksuite/affine/shared/src/adapters/middlewares/index.ts rename blocksuite/{blocks/src/root-block/clipboard => affine/shared/src/adapters}/middlewares/paste.ts (92%) rename blocksuite/affine/{components/src/rich-text/inline/presets/nodes/consts.ts => shared/src/consts/text.ts} (100%) delete mode 100644 blocksuite/blocks/src/_common/utils/url.ts delete mode 100644 blocksuite/blocks/src/root-block/clipboard/middlewares/index.ts diff --git a/blocksuite/affine/block-embed/src/embed-linked-doc-block/embed-linked-doc-block.ts b/blocksuite/affine/block-embed/src/embed-linked-doc-block/embed-linked-doc-block.ts index 625ec5041..638a473c6 100644 --- a/blocksuite/affine/block-embed/src/embed-linked-doc-block/embed-linked-doc-block.ts +++ b/blocksuite/affine/block-embed/src/embed-linked-doc-block/embed-linked-doc-block.ts @@ -1,8 +1,5 @@ import { isPeekable, Peekable } from '@blocksuite/affine-components/peek'; -import { - REFERENCE_NODE, - RefNodeSlotsProvider, -} from '@blocksuite/affine-components/rich-text'; +import { RefNodeSlotsProvider } from '@blocksuite/affine-components/rich-text'; import type { DocMode, EmbedLinkedDocModel, @@ -11,6 +8,7 @@ import type { import { EMBED_CARD_HEIGHT, EMBED_CARD_WIDTH, + REFERENCE_NODE, } from '@blocksuite/affine-shared/consts'; import { DocDisplayMetaProvider, diff --git a/blocksuite/affine/block-embed/src/embed-synced-doc-block/embed-synced-doc-block.ts b/blocksuite/affine/block-embed/src/embed-synced-doc-block/embed-synced-doc-block.ts index 533544507..a233b27a0 100644 --- a/blocksuite/affine/block-embed/src/embed-synced-doc-block/embed-synced-doc-block.ts +++ b/blocksuite/affine/block-embed/src/embed-synced-doc-block/embed-synced-doc-block.ts @@ -1,8 +1,5 @@ import { Peekable } from '@blocksuite/affine-components/peek'; -import { - REFERENCE_NODE, - RefNodeSlotsProvider, -} from '@blocksuite/affine-components/rich-text'; +import { RefNodeSlotsProvider } from '@blocksuite/affine-components/rich-text'; import { type AliasInfo, type DocMode, @@ -10,6 +7,7 @@ import { NoteDisplayMode, type ReferenceInfo, } from '@blocksuite/affine-model'; +import { REFERENCE_NODE } from '@blocksuite/affine-shared/consts'; import { DocDisplayMetaProvider, DocModeProvider, diff --git a/blocksuite/affine/components/src/rich-text/inline/presets/nodes/index.ts b/blocksuite/affine/components/src/rich-text/inline/presets/nodes/index.ts index 19d4d1d93..131689ad5 100644 --- a/blocksuite/affine/components/src/rich-text/inline/presets/nodes/index.ts +++ b/blocksuite/affine/components/src/rich-text/inline/presets/nodes/index.ts @@ -1,4 +1,3 @@ -export { DEFAULT_DOC_NAME, REFERENCE_NODE } from './consts.js'; export { AffineLink, toggleLinkPopup } from './link-node/index.js'; export * from './reference-node/reference-config.js'; export { AffineReference } from './reference-node/reference-node.js'; diff --git a/blocksuite/affine/components/src/rich-text/inline/presets/nodes/reference-node/reference-alias-popup.ts b/blocksuite/affine/components/src/rich-text/inline/presets/nodes/reference-node/reference-alias-popup.ts index 8a50f4932..72b76fed6 100644 --- a/blocksuite/affine/components/src/rich-text/inline/presets/nodes/reference-node/reference-alias-popup.ts +++ b/blocksuite/affine/components/src/rich-text/inline/presets/nodes/reference-node/reference-alias-popup.ts @@ -1,4 +1,5 @@ import type { ReferenceInfo } from '@blocksuite/affine-model'; +import { REFERENCE_NODE } from '@blocksuite/affine-shared/consts'; import { type LinkEventType, type TelemetryEvent, @@ -22,7 +23,6 @@ import { live } from 'lit/directives/live.js'; import type { EditorIconButton } from '../../../../../toolbar/index.js'; import type { AffineInlineEditor } from '../../affine-inline-specs.js'; -import { REFERENCE_NODE } from '../consts.js'; export class ReferenceAliasPopup extends SignalWatcher( WithDisposable(ShadowlessElement) diff --git a/blocksuite/affine/components/src/rich-text/inline/presets/nodes/reference-node/reference-node.ts b/blocksuite/affine/components/src/rich-text/inline/presets/nodes/reference-node/reference-node.ts index c06d1a365..bad4205ff 100644 --- a/blocksuite/affine/components/src/rich-text/inline/presets/nodes/reference-node/reference-node.ts +++ b/blocksuite/affine/components/src/rich-text/inline/presets/nodes/reference-node/reference-node.ts @@ -1,4 +1,8 @@ import type { ReferenceInfo } from '@blocksuite/affine-model'; +import { + DEFAULT_DOC_NAME, + REFERENCE_NODE, +} from '@blocksuite/affine-shared/consts'; import { DocDisplayMetaProvider } from '@blocksuite/affine-shared/services'; import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; import { @@ -32,7 +36,6 @@ import { HoverController } from '../../../../../hover/index.js'; import { Peekable } from '../../../../../peek/index.js'; import { RefNodeSlotsProvider } from '../../../../extension/index.js'; import { affineTextStyles } from '../affine-text.js'; -import { DEFAULT_DOC_NAME, REFERENCE_NODE } from '../consts.js'; import type { ReferenceNodeConfigProvider } from './reference-config.js'; import { toggleReferencePopup } from './reference-popup.js'; diff --git a/blocksuite/affine/components/src/rich-text/linked-node.ts b/blocksuite/affine/components/src/rich-text/linked-node.ts index 7f25517d3..d19c1de96 100644 --- a/blocksuite/affine/components/src/rich-text/linked-node.ts +++ b/blocksuite/affine/components/src/rich-text/linked-node.ts @@ -1,4 +1,6 @@ -import { type AffineInlineEditor, REFERENCE_NODE } from './inline/index.js'; +import { REFERENCE_NODE } from '@blocksuite/affine-shared/consts'; + +import { type AffineInlineEditor } from './inline/index.js'; export function insertLinkedNode({ inlineEditor, diff --git a/blocksuite/affine/shared/src/adapters/index.ts b/blocksuite/affine/shared/src/adapters/index.ts index 94dda0773..709dfc3d1 100644 --- a/blocksuite/affine/shared/src/adapters/index.ts +++ b/blocksuite/affine/shared/src/adapters/index.ts @@ -29,6 +29,7 @@ export { MarkdownASTToDeltaMatcherIdentifier, MarkdownDeltaConverter, } from './markdown'; +export * from './middlewares'; export { BlockNotionHtmlAdapterExtension, type BlockNotionHtmlAdapterMatcher, diff --git a/blocksuite/blocks/src/root-block/clipboard/middlewares/copy.ts b/blocksuite/affine/shared/src/adapters/middlewares/copy.ts similarity index 85% rename from blocksuite/blocks/src/root-block/clipboard/middlewares/copy.ts rename to blocksuite/affine/shared/src/adapters/middlewares/copy.ts index e63bf3c5c..f5123fc69 100644 --- a/blocksuite/blocks/src/root-block/clipboard/middlewares/copy.ts +++ b/blocksuite/affine/shared/src/adapters/middlewares/copy.ts @@ -1,4 +1,8 @@ -import type { EditorHost, TextRangePoint } from '@blocksuite/block-std'; +import type { + BlockStdScope, + EditorHost, + TextRangePoint, +} from '@blocksuite/block-std'; import type { BlockSnapshot, DraftModel, @@ -6,7 +10,7 @@ import type { JobSlots, } from '@blocksuite/store'; -import { matchFlavours } from '../../../_common/utils/index.js'; +import { matchFlavours } from '../../utils'; const handlePoint = ( point: TextRangePoint, @@ -47,7 +51,7 @@ const sliceText = (slots: JobSlots, std: EditorHost['std']) => { }); }; -export const copyMiddleware = (std: EditorHost['std']): JobMiddleware => { +export const copyMiddleware = (std: BlockStdScope): JobMiddleware => { return ({ slots }) => { sliceText(slots, std); }; diff --git a/blocksuite/affine/shared/src/adapters/middlewares/index.ts b/blocksuite/affine/shared/src/adapters/middlewares/index.ts new file mode 100644 index 000000000..786b91310 --- /dev/null +++ b/blocksuite/affine/shared/src/adapters/middlewares/index.ts @@ -0,0 +1,2 @@ +export * from './copy'; +export * from './paste'; diff --git a/blocksuite/blocks/src/root-block/clipboard/middlewares/paste.ts b/blocksuite/affine/shared/src/adapters/middlewares/paste.ts similarity index 92% rename from blocksuite/blocks/src/root-block/clipboard/middlewares/paste.ts rename to blocksuite/affine/shared/src/adapters/middlewares/paste.ts index ba91e9930..1950a5c0e 100644 --- a/blocksuite/blocks/src/root-block/clipboard/middlewares/paste.ts +++ b/blocksuite/affine/shared/src/adapters/middlewares/paste.ts @@ -1,12 +1,9 @@ -import { REFERENCE_NODE } from '@blocksuite/affine-components/rich-text'; -import type { ParagraphBlockModel } from '@blocksuite/affine-model'; import { - ParseDocUrlProvider, - type ParseDocUrlService, - TelemetryProvider, -} from '@blocksuite/affine-shared/services'; -import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; -import { referenceToNode } from '@blocksuite/affine-shared/utils'; + type DocMode, + DocModes, + type ParagraphBlockModel, + type ReferenceInfo, +} from '@blocksuite/affine-model'; import { BLOCK_ID_ATTR, type BlockComponent, @@ -27,8 +24,14 @@ import { type Text, } from '@blocksuite/store'; -import { matchFlavours } from '../../../_common/utils/index.js'; -import { extractSearchParams } from '../../../_common/utils/url.js'; +import { REFERENCE_NODE } from '../../consts'; +import { + ParseDocUrlProvider, + type ParseDocUrlService, + TelemetryProvider, +} from '../../services'; +import type { AffineTextAttributes } from '../../types'; +import { matchFlavours, referenceToNode } from '../../utils'; function findLastMatchingNode( root: BlockSnapshot[], @@ -527,3 +530,40 @@ export const pasteMiddleware = (std: EditorHost['std']): JobMiddleware => { }); }; }; + +function extractSearchParams(link: string) { + try { + const url = new URL(link); + const mode = url.searchParams.get('mode') as DocMode | undefined; + + if (mode && DocModes.includes(mode)) { + const params: ReferenceInfo['params'] = { mode: mode as DocMode }; + const blockIds = url.searchParams + .get('blockIds') + ?.trim() + .split(',') + .map(id => id.trim()) + .filter(id => id.length); + const elementIds = url.searchParams + .get('elementIds') + ?.trim() + .split(',') + .map(id => id.trim()) + .filter(id => id.length); + + if (blockIds?.length) { + params.blockIds = blockIds; + } + + if (elementIds?.length) { + params.elementIds = elementIds; + } + + return { params }; + } + } catch (err) { + console.error(err); + } + + return null; +} diff --git a/blocksuite/affine/shared/src/consts/index.ts b/blocksuite/affine/shared/src/consts/index.ts index bd323e667..cccb7dcd2 100644 --- a/blocksuite/affine/shared/src/consts/index.ts +++ b/blocksuite/affine/shared/src/consts/index.ts @@ -65,3 +65,4 @@ export const CANVAS_EXPORT_IGNORE_TAGS = [ export * from './bracket-pairs.js'; export * from './note.js'; +export * from './text.js'; diff --git a/blocksuite/affine/components/src/rich-text/inline/presets/nodes/consts.ts b/blocksuite/affine/shared/src/consts/text.ts similarity index 100% rename from blocksuite/affine/components/src/rich-text/inline/presets/nodes/consts.ts rename to blocksuite/affine/shared/src/consts/text.ts diff --git a/blocksuite/blocks/src/_common/utils/url.ts b/blocksuite/blocks/src/_common/utils/url.ts deleted file mode 100644 index ec1007004..000000000 --- a/blocksuite/blocks/src/_common/utils/url.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - type DocMode, - DocModes, - type ReferenceInfo, -} from '@blocksuite/affine-model'; - -export function extractSearchParams(link: string) { - try { - const url = new URL(link); - const mode = url.searchParams.get('mode') as DocMode | undefined; - - if (mode && DocModes.includes(mode)) { - const params: ReferenceInfo['params'] = { mode: mode as DocMode }; - const blockIds = url.searchParams - .get('blockIds') - ?.trim() - .split(',') - .map(id => id.trim()) - .filter(id => id.length); - const elementIds = url.searchParams - .get('elementIds') - ?.trim() - .split(',') - .map(id => id.trim()) - .filter(id => id.length); - - if (blockIds?.length) { - params.blockIds = blockIds; - } - - if (elementIds?.length) { - params.elementIds = elementIds; - } - - return { params }; - } - } catch (err) { - console.error(err); - } - - return null; -} diff --git a/blocksuite/blocks/src/code-block/clipboard/index.ts b/blocksuite/blocks/src/code-block/clipboard/index.ts index 39d040031..8fc1ef4c5 100644 --- a/blocksuite/blocks/src/code-block/clipboard/index.ts +++ b/blocksuite/blocks/src/code-block/clipboard/index.ts @@ -1,5 +1,6 @@ import { HtmlAdapter, + pasteMiddleware, PlainTextAdapter, } from '@blocksuite/affine-shared/adapters'; import { @@ -9,8 +10,6 @@ import { } from '@blocksuite/block-std'; import { assertExists, DisposableGroup } from '@blocksuite/global/utils'; -import { pasteMiddleware } from '../../root-block/clipboard/middlewares/index.js'; - export class CodeClipboardController { private _clipboard!: Clipboard; diff --git a/blocksuite/blocks/src/code-block/code-block.ts b/blocksuite/blocks/src/code-block/code-block.ts index 780a933de..a782c5902 100644 --- a/blocksuite/blocks/src/code-block/code-block.ts +++ b/blocksuite/blocks/src/code-block/code-block.ts @@ -5,7 +5,10 @@ import { } from '@blocksuite/affine-components/rich-text'; import type { CodeBlockModel } from '@blocksuite/affine-model'; import { BRACKET_PAIRS, NOTE_SELECTOR } from '@blocksuite/affine-shared/consts'; -import { NotificationProvider } from '@blocksuite/affine-shared/services'; +import { + DocModeProvider, + NotificationProvider, +} from '@blocksuite/affine-shared/services'; import { getViewportElement } from '@blocksuite/affine-shared/utils'; import type { BlockComponent } from '@blocksuite/block-std'; import { getInlineRangeProvider } from '@blocksuite/block-std'; @@ -24,7 +27,6 @@ import { query } from 'lit/decorators.js'; import { classMap } from 'lit/directives/class-map.js'; import type { ThemedToken } from 'shiki'; -import { EdgelessRootBlockComponent } from '../root-block/edgeless/edgeless-root-block.js'; import { CodeClipboardController } from './clipboard/index.js'; import { CodeBlockInlineManagerExtension } from './code-block-inline.js'; import type { CodeBlockService } from './code-block-service.js'; @@ -72,9 +74,8 @@ export class CodeBlockComponent extends CaptionedBlockComponent< } override get topContenteditableElement() { - if (this.rootComponent instanceof EdgelessRootBlockComponent) { - const el = this.closest(NOTE_SELECTOR); - return el; + if (this.std.get(DocModeProvider).getEditorMode() === 'edgeless') { + return this.closest(NOTE_SELECTOR); } return this.rootComponent; } diff --git a/blocksuite/blocks/src/database-block/detail-panel/note-renderer.ts b/blocksuite/blocks/src/database-block/detail-panel/note-renderer.ts index 95916e340..e1de4afb9 100644 --- a/blocksuite/blocks/src/database-block/detail-panel/note-renderer.ts +++ b/blocksuite/blocks/src/database-block/detail-panel/note-renderer.ts @@ -1,8 +1,8 @@ -import { REFERENCE_NODE } from '@blocksuite/affine-components/rich-text'; import type { DatabaseBlockModel, RootBlockModel, } from '@blocksuite/affine-model'; +import { REFERENCE_NODE } from '@blocksuite/affine-shared/consts'; import { TelemetryProvider } from '@blocksuite/affine-shared/services'; import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; import { diff --git a/blocksuite/blocks/src/root-block/clipboard/index.ts b/blocksuite/blocks/src/root-block/clipboard/index.ts index 0cfbe1131..b609581cb 100644 --- a/blocksuite/blocks/src/root-block/clipboard/index.ts +++ b/blocksuite/blocks/src/root-block/clipboard/index.ts @@ -1,8 +1,10 @@ import { AttachmentAdapter, + copyMiddleware, HtmlAdapter, ImageAdapter, NotionTextAdapter, + pasteMiddleware, } from '@blocksuite/affine-shared/adapters'; import type { BlockComponent, UIEventHandler } from '@blocksuite/block-std'; import { DisposableGroup } from '@blocksuite/global/utils'; @@ -15,7 +17,6 @@ import { titleMiddleware, } from '../../_common/transformers/middlewares.js'; import { ClipboardAdapter } from './adapter.js'; -import { copyMiddleware, pasteMiddleware } from './middlewares/index.js'; export class PageClipboard { private readonly _copySelected = (onCopy?: () => void) => { diff --git a/blocksuite/blocks/src/root-block/clipboard/middlewares/index.ts b/blocksuite/blocks/src/root-block/clipboard/middlewares/index.ts deleted file mode 100644 index f3a618466..000000000 --- a/blocksuite/blocks/src/root-block/clipboard/middlewares/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './copy.js'; -export * from './paste.js'; diff --git a/blocksuite/blocks/src/root-block/widgets/keyboard-toolbar/config.ts b/blocksuite/blocks/src/root-block/widgets/keyboard-toolbar/config.ts index cb8ec0da5..384458400 100644 --- a/blocksuite/blocks/src/root-block/widgets/keyboard-toolbar/config.ts +++ b/blocksuite/blocks/src/root-block/widgets/keyboard-toolbar/config.ts @@ -3,10 +3,10 @@ import { getSurfaceBlock } from '@blocksuite/affine-block-surface'; import { getInlineEditorByModel, insertContent, - REFERENCE_NODE, } from '@blocksuite/affine-components/rich-text'; import { toast } from '@blocksuite/affine-components/toast'; import type { FrameBlockModel } from '@blocksuite/affine-model'; +import { REFERENCE_NODE } from '@blocksuite/affine-shared/consts'; import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; import { createDefaultDoc, diff --git a/blocksuite/blocks/src/root-block/widgets/slash-menu/config.ts b/blocksuite/blocks/src/root-block/widgets/slash-menu/config.ts index b014263ba..c79f93158 100644 --- a/blocksuite/blocks/src/root-block/widgets/slash-menu/config.ts +++ b/blocksuite/blocks/src/root-block/widgets/slash-menu/config.ts @@ -28,7 +28,6 @@ import { import { getInlineEditorByModel, insertContent, - REFERENCE_NODE, textConversionConfigs, textFormatConfigs, } from '@blocksuite/affine-components/rich-text'; @@ -37,6 +36,7 @@ import type { FrameBlockModel, ParagraphBlockModel, } from '@blocksuite/affine-model'; +import { REFERENCE_NODE } from '@blocksuite/affine-shared/consts'; import { TelemetryProvider } from '@blocksuite/affine-shared/services'; import { createDefaultDoc,