Skip to content

Commit f518365

Browse files
committed
feat(editor): add toolbar registry extension
1 parent ea53486 commit f518365

File tree

10 files changed

+110
-7
lines changed

10 files changed

+110
-7
lines changed

blocksuite/affine/block-attachment/src/attachment-spec.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { BlockViewExtension, FlavourExtension } from '@blocksuite/block-std';
1+
import { ToolbarModuleExtension } from '@blocksuite/affine-shared/services';
2+
import {
3+
BlockFlavourIdentifier,
4+
BlockViewExtension,
5+
FlavourExtension,
6+
} from '@blocksuite/block-std';
27
import type { ExtensionType } from '@blocksuite/store';
38
import { literal } from 'lit/static-html.js';
49

@@ -12,10 +17,12 @@ import {
1217
AttachmentEmbedService,
1318
} from './embed.js';
1419

20+
const Flavour = 'affine:attachment';
21+
1522
export const AttachmentBlockSpec: ExtensionType[] = [
16-
FlavourExtension('affine:attachment'),
23+
FlavourExtension(Flavour),
1724
AttachmentBlockService,
18-
BlockViewExtension('affine:attachment', model => {
25+
BlockViewExtension(Flavour, model => {
1926
return model.parent?.flavour === 'affine:surface'
2027
? literal`affine-edgeless-attachment`
2128
: literal`affine-attachment`;
@@ -24,4 +31,7 @@ export const AttachmentBlockSpec: ExtensionType[] = [
2431
AttachmentEmbedConfigExtension(),
2532
AttachmentEmbedService,
2633
AttachmentBlockNotionHtmlAdapterExtension,
34+
ToolbarModuleExtension({
35+
id: BlockFlavourIdentifier(Flavour),
36+
}),
2737
];

blocksuite/affine/block-image/src/image-spec.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { ImageSelectionExtension } from '@blocksuite/affine-shared/selection';
2+
import { ToolbarModuleExtension } from '@blocksuite/affine-shared/services';
23
import {
4+
BlockFlavourIdentifier,
35
BlockViewExtension,
46
CommandExtension,
57
FlavourExtension,
@@ -12,11 +14,13 @@ import { ImageBlockAdapterExtensions } from './adapters/extension.js';
1214
import { commands } from './commands/index.js';
1315
import { ImageBlockService, ImageDropOption } from './image-service.js';
1416

17+
const Flavour = 'affine:image';
18+
1519
export const ImageBlockSpec: ExtensionType[] = [
16-
FlavourExtension('affine:image'),
20+
FlavourExtension(Flavour),
1721
ImageBlockService,
1822
CommandExtension(commands),
19-
BlockViewExtension('affine:image', model => {
23+
BlockViewExtension(Flavour, model => {
2024
const parent = model.doc.getParent(model.id);
2125

2226
if (parent?.flavour === 'affine:surface') {
@@ -25,10 +29,13 @@ export const ImageBlockSpec: ExtensionType[] = [
2529

2630
return literal`affine-image`;
2731
}),
28-
WidgetViewMapExtension('affine:image', {
32+
WidgetViewMapExtension(Flavour, {
2933
imageToolbar: literal`affine-image-toolbar-widget`,
3034
}),
3135
ImageDropOption,
3236
ImageSelectionExtension,
3337
ImageBlockAdapterExtensions,
38+
ToolbarModuleExtension({
39+
id: BlockFlavourIdentifier(Flavour),
40+
}),
3441
].flat();

blocksuite/affine/shared/src/services/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ export * from './parse-url-service';
1313
export * from './quick-search-service';
1414
export * from './telemetry-service';
1515
export * from './theme-service';
16+
export * from './toolbar-service';
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './module';
2+
export * from './registry';
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import type { BlockFlavourIdentifier } from '@blocksuite/block-std';
2+
3+
export abstract class ToolbarModule {
4+
constructor(public readonly id: ReturnType<typeof BlockFlavourIdentifier>) {}
5+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import {
2+
type BlockStdScope,
3+
LifeCycleWatcher,
4+
StdIdentifier,
5+
} from '@blocksuite/block-std';
6+
import {
7+
type Container,
8+
createIdentifier,
9+
createScope,
10+
} from '@blocksuite/global/di';
11+
import type { ExtensionType } from '@blocksuite/store';
12+
13+
import type { ToolbarModule } from './module';
14+
15+
export const ToolbarModuleIdentifier = createIdentifier<ToolbarModule>(
16+
'AffineToolbarModuleIdentifier'
17+
);
18+
19+
export const ToolbarModulesIdentifier = createIdentifier<
20+
Map<string, ToolbarModule>
21+
>('AffineToolbarModulesIdentifier');
22+
23+
export const ToolbarRegistryScope = createScope('AffineToolbarRegistryScope');
24+
25+
export const ToolbarRegistryIdentifier =
26+
createIdentifier<ToolbarRegistryExtension>('AffineToolbarRegistryIdentifier');
27+
28+
export function ToolbarModuleExtension(module: ToolbarModule): ExtensionType {
29+
return {
30+
setup: di => {
31+
di.scope(ToolbarRegistryScope).addImpl(
32+
ToolbarModuleIdentifier(module.id.variant),
33+
module
34+
);
35+
},
36+
};
37+
}
38+
39+
export class ToolbarRegistryExtension extends LifeCycleWatcher {
40+
constructor(
41+
std: BlockStdScope,
42+
readonly modules: Map<string, ToolbarModule>
43+
) {
44+
super(std);
45+
}
46+
47+
static override readonly key = 'toolbar-registry';
48+
49+
static override setup(di: Container) {
50+
di.scope(ToolbarRegistryScope)
51+
.addImpl(ToolbarModulesIdentifier, provider =>
52+
provider.getAll(ToolbarModuleIdentifier)
53+
)
54+
.addImpl(ToolbarRegistryIdentifier, this, [
55+
StdIdentifier,
56+
ToolbarModulesIdentifier,
57+
]);
58+
}
59+
}
Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
1+
import {
2+
ToolbarRegistryIdentifier,
3+
ToolbarRegistryScope,
4+
} from '@blocksuite/affine-shared/services';
15
import { WidgetComponent } from '@blocksuite/block-std';
26

37
export const AFFINE_TOOLBAR_WIDGET = 'affine-toolbar-widget';
48

5-
export class AffineToolbarWidget extends WidgetComponent {}
9+
export class AffineToolbarWidget extends WidgetComponent {
10+
override connectedCallback() {
11+
super.connectedCallback();
12+
13+
const toolbarRegistry = this.std.container
14+
.provider(ToolbarRegistryScope, this.std.provider)
15+
.get(ToolbarRegistryIdentifier);
16+
console.log(toolbarRegistry);
17+
}
18+
}

blocksuite/blocks/src/root-block/edgeless/edgeless-root-spec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
EmbedOptionService,
66
PageViewportServiceExtension,
77
ThemeService,
8+
ToolbarRegistryExtension,
89
} from '@blocksuite/affine-shared/services';
910
import { AFFINE_DRAG_HANDLE_WIDGET } from '@blocksuite/affine-widget-drag-handle';
1011
import { AFFINE_FRAME_TITLE_WIDGET } from '@blocksuite/affine-widget-frame-title';
@@ -102,6 +103,7 @@ const EdgelessCommonExtension: ExtensionType[] = [
102103
PageViewportServiceExtension,
103104
RootBlockAdapterExtensions,
104105
FileDropExtension,
106+
ToolbarRegistryExtension,
105107
].flat();
106108

107109
export const EdgelessRootBlockSpec: ExtensionType[] = [

blocksuite/blocks/src/root-block/page/page-root-spec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
EmbedOptionService,
66
PageViewportServiceExtension,
77
ThemeService,
8+
ToolbarRegistryExtension,
89
} from '@blocksuite/affine-shared/services';
910
import { AFFINE_DRAG_HANDLE_WIDGET } from '@blocksuite/affine-widget-drag-handle';
1011
import { AFFINE_DOC_REMOTE_SELECTION_WIDGET } from '@blocksuite/affine-widget-remote-selection';
@@ -83,6 +84,7 @@ export const PageRootBlockSpec: ExtensionType[] = [
8384
DNDAPIExtension,
8485
RootBlockAdapterExtensions,
8586
FileDropExtension,
87+
ToolbarRegistryExtension,
8688
].flat();
8789

8890
export const PreviewPageRootBlockSpec: ExtensionType[] = [

packages/frontend/core/src/components/blocksuite/block-suite-editor/specs/common.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
ParagraphBlockSpec,
2222
RefNodeSlotsExtension,
2323
RichTextExtensions,
24+
ToolbarRegistryExtension,
2425
} from '@blocksuite/affine/blocks';
2526
import type { ExtensionType } from '@blocksuite/affine/store';
2627

@@ -38,6 +39,7 @@ const CommonBlockSpecs: ExtensionType[] = [
3839
AttachmentBlockSpec,
3940
AdapterFactoryExtensions,
4041
FontLoaderService,
42+
ToolbarRegistryExtension,
4143
].flat();
4244

4345
export const DefaultBlockSpecs: ExtensionType[] = [

0 commit comments

Comments
 (0)