Skip to content

Commit 625707a

Browse files
committed
refactor(editor): edgeless external embed card toolbar config extension
1 parent 051e055 commit 625707a

File tree

11 files changed

+416
-165
lines changed

11 files changed

+416
-165
lines changed

blocksuite/affine/blocks/block-embed/src/configs/toolbar.ts

+327-49
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
11
import { EmbedFigmaBlockSchema } from '@blocksuite/affine-model';
2-
import { ToolbarModuleExtension } from '@blocksuite/affine-shared/services';
32
import { SlashMenuConfigExtension } from '@blocksuite/affine-widget-slash-menu';
4-
import {
5-
BlockServiceIdentifier,
6-
BlockViewExtension,
7-
FlavourExtension,
8-
} from '@blocksuite/block-std';
3+
import { BlockViewExtension, FlavourExtension } from '@blocksuite/block-std';
94
import type { ExtensionType } from '@blocksuite/store';
105
import { literal } from 'lit/static-html.js';
116

12-
import { createBuiltinToolbarConfigForExternal } from '../configs/toolbar';
7+
import { createBuiltinToolbarConfigExtension } from '../configs/toolbar';
138
import { EmbedFigmaBlockAdapterExtensions } from './adapters/extension';
149
import { embedFigmaSlashMenuConfig } from './configs/slash-menu';
1510
import { EmbedFigmaBlockComponent } from './embed-figma-block';
@@ -26,9 +21,6 @@ export const EmbedFigmaBlockSpec: ExtensionType[] = [
2621
}),
2722
EmbedFigmaBlockAdapterExtensions,
2823
EmbedFigmaBlockOptionConfig,
29-
ToolbarModuleExtension({
30-
id: BlockServiceIdentifier(flavour),
31-
config: createBuiltinToolbarConfigForExternal(EmbedFigmaBlockComponent),
32-
}),
24+
createBuiltinToolbarConfigExtension(flavour, EmbedFigmaBlockComponent),
3325
SlashMenuConfigExtension(flavour, embedFigmaSlashMenuConfig),
3426
].flat();

blocksuite/affine/blocks/block-embed/src/embed-github-block/embed-github-spec.ts

+3-11
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
11
import { EmbedGithubBlockSchema } from '@blocksuite/affine-model';
2-
import { ToolbarModuleExtension } from '@blocksuite/affine-shared/services';
32
import { SlashMenuConfigExtension } from '@blocksuite/affine-widget-slash-menu';
4-
import {
5-
BlockServiceIdentifier,
6-
BlockViewExtension,
7-
FlavourExtension,
8-
} from '@blocksuite/block-std';
3+
import { BlockViewExtension, FlavourExtension } from '@blocksuite/block-std';
94
import type { ExtensionType } from '@blocksuite/store';
105
import { literal } from 'lit/static-html.js';
116

12-
import { createBuiltinToolbarConfigForExternal } from '../configs/toolbar';
7+
import { createBuiltinToolbarConfigExtension } from '../configs/toolbar';
138
import { EmbedGithubBlockAdapterExtensions } from './adapters/extension';
149
import { embedGithubSlashMenuConfig } from './configs/slash-menu';
1510
import { EmbedGithubBlockComponent } from './embed-github-block';
@@ -30,9 +25,6 @@ export const EmbedGithubBlockSpec: ExtensionType[] = [
3025
}),
3126
EmbedGithubBlockAdapterExtensions,
3227
EmbedGithubBlockOptionConfig,
33-
ToolbarModuleExtension({
34-
id: BlockServiceIdentifier(flavour),
35-
config: createBuiltinToolbarConfigForExternal(EmbedGithubBlockComponent),
36-
}),
28+
createBuiltinToolbarConfigExtension(flavour, EmbedGithubBlockComponent),
3729
SlashMenuConfigExtension(flavour, embedGithubSlashMenuConfig),
3830
].flat();

blocksuite/affine/blocks/block-embed/src/embed-loom-block/embed-loom-spec.ts

+3-11
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
11
import { EmbedLoomBlockSchema } from '@blocksuite/affine-model';
2-
import { ToolbarModuleExtension } from '@blocksuite/affine-shared/services';
32
import { SlashMenuConfigExtension } from '@blocksuite/affine-widget-slash-menu';
4-
import {
5-
BlockServiceIdentifier,
6-
BlockViewExtension,
7-
FlavourExtension,
8-
} from '@blocksuite/block-std';
3+
import { BlockViewExtension, FlavourExtension } from '@blocksuite/block-std';
94
import type { ExtensionType } from '@blocksuite/store';
105
import { literal } from 'lit/static-html.js';
116

12-
import { createBuiltinToolbarConfigForExternal } from '../configs/toolbar';
7+
import { createBuiltinToolbarConfigExtension } from '../configs/toolbar';
138
import { EmbedLoomBlockAdapterExtensions } from './adapters/extension';
149
import { embedLoomSlashMenuConfig } from './configs/slash-menu';
1510
import { EmbedLoomBlockComponent } from './embed-loom-block';
@@ -30,9 +25,6 @@ export const EmbedLoomBlockSpec: ExtensionType[] = [
3025
}),
3126
EmbedLoomBlockAdapterExtensions,
3227
EmbedLoomBlockOptionConfig,
33-
ToolbarModuleExtension({
34-
id: BlockServiceIdentifier(flavour),
35-
config: createBuiltinToolbarConfigForExternal(EmbedLoomBlockComponent),
36-
}),
28+
createBuiltinToolbarConfigExtension(flavour, EmbedLoomBlockComponent),
3729
SlashMenuConfigExtension(flavour, embedLoomSlashMenuConfig),
3830
].flat();

blocksuite/affine/blocks/block-embed/src/embed-youtube-block/embed-youtube-spec.ts

+3-11
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
11
import { EmbedYoutubeBlockSchema } from '@blocksuite/affine-model';
2-
import { ToolbarModuleExtension } from '@blocksuite/affine-shared/services';
32
import { SlashMenuConfigExtension } from '@blocksuite/affine-widget-slash-menu';
4-
import {
5-
BlockServiceIdentifier,
6-
BlockViewExtension,
7-
FlavourExtension,
8-
} from '@blocksuite/block-std';
3+
import { BlockViewExtension, FlavourExtension } from '@blocksuite/block-std';
94
import type { ExtensionType } from '@blocksuite/store';
105
import { literal } from 'lit/static-html.js';
116

12-
import { createBuiltinToolbarConfigForExternal } from '../configs/toolbar';
7+
import { createBuiltinToolbarConfigExtension } from '../configs/toolbar';
138
import { EmbedYoutubeBlockAdapterExtensions } from './adapters/extension';
149
import { embedYoutubeSlashMenuConfig } from './configs/slash-menu';
1510
import { EmbedYoutubeBlockComponent } from './embed-youtube-block';
@@ -30,9 +25,6 @@ export const EmbedYoutubeBlockSpec: ExtensionType[] = [
3025
}),
3126
EmbedYoutubeBlockAdapterExtensions,
3227
EmbedYoutubeBlockOptionConfig,
33-
ToolbarModuleExtension({
34-
id: BlockServiceIdentifier(flavour),
35-
config: createBuiltinToolbarConfigForExternal(EmbedYoutubeBlockComponent),
36-
}),
28+
createBuiltinToolbarConfigExtension(flavour, EmbedYoutubeBlockComponent),
3729
SlashMenuConfigExtension('affine:embed-youtube', embedYoutubeSlashMenuConfig),
3830
].flat();

blocksuite/affine/blocks/block-root/src/edgeless/configs/toolbar/embed.ts

-11
This file was deleted.

blocksuite/affine/blocks/block-root/src/edgeless/configs/toolbar/index.ts

-6
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import type { ExtensionType } from '@blocksuite/store';
44

55
import { builtinBrushToolbarConfig } from './brush';
66
import { builtinConnectorToolbarConfig } from './connector';
7-
import { builtinEmbedToolbarConfig } from './embed';
87
import { builtinFrameToolbarConfig } from './frame';
98
import { builtinGroupToolbarConfig } from './group';
109
import { builtinImageToolbarConfig } from './image';
@@ -30,11 +29,6 @@ export const EdgelessElementToolbarExtension: ExtensionType[] = [
3029
config: builtinConnectorToolbarConfig,
3130
}),
3231

33-
ToolbarModuleExtension({
34-
id: BlockFlavourIdentifier('affine:surface:embed'),
35-
config: builtinEmbedToolbarConfig,
36-
}),
37-
3832
ToolbarModuleExtension({
3933
id: BlockFlavourIdentifier('affine:surface:frame'),
4034
config: builtinFrameToolbarConfig,

blocksuite/affine/model/src/blocks/embed/types.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { GfxModel } from '@blocksuite/block-std/gfx';
12
import type { BlockModel } from '@blocksuite/store';
23

34
import { EmbedFigmaModel } from './figma';
@@ -34,7 +35,7 @@ export type LinkableEmbedModel = EmbedCardModel | EmbedIframeBlockModel;
3435
export type BuiltInEmbedModel = EmbedCardModel | EmbedHtmlModel;
3536

3637
export function isExternalEmbedModel(
37-
model: BlockModel
38+
model: GfxModel | BlockModel
3839
): model is InstanceType<ExternalEmbedModel> {
3940
return (
4041
model instanceof EmbedFigmaModel ||
@@ -45,7 +46,7 @@ export function isExternalEmbedModel(
4546
}
4647

4748
export function isInternalEmbedModel(
48-
model: BlockModel
49+
model: GfxModel | BlockModel
4950
): model is InstanceType<InternalEmbedModel> {
5051
return (
5152
model instanceof EmbedLinkedDocModel || model instanceof EmbedSyncedDocModel

blocksuite/affine/shared/src/services/toolbar-service/context.ts

+27-13
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ abstract class ToolbarContextBase {
133133
);
134134
}
135135

136-
getSurfaceModelsByType<M extends abstract new (...args: any) => any>(
137-
klass: M
136+
getSurfaceModelsByType<T extends abstract new (...args: any) => any>(
137+
klass: T
138138
) {
139139
if (this.hasSelectedSurfaceModels) {
140140
const elements = this.elementsMap$.peek().get(this.flavour$.peek());
@@ -145,6 +145,20 @@ abstract class ToolbarContextBase {
145145
return [];
146146
}
147147

148+
getSurfaceBlocksByType<T extends abstract new (...args: any) => any>(
149+
klass: T
150+
) {
151+
if (this.hasSelectedSurfaceModels) {
152+
const elements = this.elementsMap$.peek().get(this.flavour$.peek());
153+
if (elements?.length) {
154+
return elements
155+
.map(model => this.gfx.view.get(model.id))
156+
.filter(block => block && this.matchBlock(block, klass));
157+
}
158+
}
159+
return [];
160+
}
161+
148162
getCurrentBlockBy<T extends SelectionConstructor>(type: T) {
149163
const selection = this.selection.find(type);
150164
if (!selection) return null;
@@ -165,17 +179,17 @@ abstract class ToolbarContextBase {
165179
: this.getCurrentBlockBy(BlockSelection);
166180
}
167181

168-
getCurrentBlockByType<K extends abstract new (...args: any) => any>(
169-
klass: K
182+
getCurrentBlockByType<T extends abstract new (...args: any) => any>(
183+
klass: T
170184
) {
171185
const block = this.getCurrentBlock();
172186
return this.matchBlock(block, klass) ? block : null;
173187
}
174188

175-
matchBlock<K extends abstract new (...args: any) => any>(
189+
matchBlock<T extends abstract new (...args: any) => any>(
176190
component: GfxElementModelView | BlockComponent | null,
177-
klass: K
178-
): component is InstanceType<K> {
191+
klass: T
192+
): component is InstanceType<T> {
179193
return component instanceof klass;
180194
}
181195

@@ -189,23 +203,23 @@ abstract class ToolbarContextBase {
189203
return this.store.getBlock(selection.blockId)?.model ?? null;
190204
}
191205

192-
getCurrentModel() {
206+
getCurrentModel(): GfxModel | BlockModel | null {
193207
return this.hasSelectedSurfaceModels
194208
? this.getCurrentModelBy(SurfaceSelection)
195209
: this.getCurrentModelBy(BlockSelection);
196210
}
197211

198-
getCurrentModelByType<M extends abstract new (...args: any) => any>(
199-
klass: M
212+
getCurrentModelByType<T extends abstract new (...args: any) => any>(
213+
klass: T
200214
) {
201215
const model = this.getCurrentModel();
202216
return this.matchModel(model, klass) ? model : null;
203217
}
204218

205-
matchModel<K extends abstract new (...args: any) => any>(
219+
matchModel<T extends abstract new (...args: any) => any>(
206220
model: GfxModel | BlockModel | null,
207-
klass: K
208-
): model is InstanceType<K> {
221+
klass: T
222+
): model is InstanceType<T> {
209223
return model instanceof klass;
210224
}
211225

blocksuite/affine/widgets/widget-toolbar/src/toolbar.ts

+26-19
Original file line numberDiff line numberDiff line change
@@ -392,23 +392,30 @@ export class AffineToolbarWidget extends WidgetComponent {
392392
// `card view` or `embed view`
393393
disposables.add(
394394
std.view.viewUpdated.subscribe(record => {
395-
if (record.type !== 'block') return;
396-
if (!flags.isBlock()) return;
397-
398-
const blockIds = std.selection
399-
.filter$(BlockSelection)
400-
.peek()
401-
.map(s => s.blockId);
402-
403-
if (record.method === 'add' && blockIds.includes(record.id)) {
404-
batch(() => {
405-
this.setReferenceElementWithBlocks(
406-
blockIds
407-
.map(id => std.view.getBlock(id))
408-
.filter(block => block !== null)
409-
);
410-
flags.refresh(Flag.Block);
411-
});
395+
const hasAddedBlock =
396+
record.type === 'block' && record.method === 'add';
397+
if (!hasAddedBlock) return;
398+
399+
if (flags.isBlock()) {
400+
const blockIds = std.selection
401+
.filter$(BlockSelection)
402+
.peek()
403+
.map(s => s.blockId);
404+
if (blockIds.includes(record.id)) {
405+
batch(() => {
406+
this.setReferenceElementWithBlocks(
407+
blockIds
408+
.map(id => std.view.getBlock(id))
409+
.filter(block => block !== null)
410+
);
411+
flags.refresh(Flag.Block);
412+
});
413+
}
414+
return;
415+
}
416+
417+
if (flags.isSurface()) {
418+
flags.refresh(Flag.Surface);
412419
return;
413420
}
414421
})
@@ -462,8 +469,8 @@ export class AffineToolbarWidget extends WidgetComponent {
462469

463470
// Handles elements when resizing
464471
const edgelessSlots = std.get(EdgelessLegacySlotIdentifier);
465-
disposables.add(edgelessSlots.elementResizeStart.on(dragStart));
466-
disposables.add(edgelessSlots.elementResizeEnd.on(dragEnd));
472+
disposables.add(edgelessSlots.elementResizeStart.subscribe(dragStart));
473+
disposables.add(edgelessSlots.elementResizeEnd.subscribe(dragEnd));
467474

468475
// Handles elements when hovering
469476
disposables.add(

0 commit comments

Comments
 (0)