Skip to content

Commit

Permalink
feat(editor): add toolbar registry extension
Browse files Browse the repository at this point in the history
  • Loading branch information
fundon committed Jan 7, 2025
1 parent 814e297 commit 092379f
Show file tree
Hide file tree
Showing 10 changed files with 97 additions and 2 deletions.
9 changes: 8 additions & 1 deletion blocksuite/affine/block-image/src/image-spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { ImageSelectionExtension } from '@blocksuite/affine-shared/selection';
import { ToolbarModuleExtension } from '@blocksuite/affine-shared/services';
import {
BlockFlavourIdentifier,
BlockViewExtension,
CommandExtension,
FlavourExtension,
Expand All @@ -12,8 +14,10 @@ import { ImageBlockAdapterExtensions } from './adapters/extension.js';
import { commands } from './commands/index.js';
import { ImageBlockService, ImageDropOption } from './image-service.js';

const Id = FlavourExtension('affine:image');

export const ImageBlockSpec: ExtensionType[] = [
FlavourExtension('affine:image'),
Id,
ImageBlockService,
CommandExtension(commands),
BlockViewExtension('affine:image', model => {
Expand All @@ -31,4 +35,7 @@ export const ImageBlockSpec: ExtensionType[] = [
ImageDropOption,
ImageSelectionExtension,
ImageBlockAdapterExtensions,
ToolbarModuleExtension({
id: BlockFlavourIdentifier('affine:image'),
}),
].flat();
1 change: 1 addition & 0 deletions blocksuite/affine/shared/src/services/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@ export * from './parse-url-service';
export * from './quick-search-service';
export * from './telemetry-service';
export * from './theme-service';
export * from './toolbar-service';
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './module';
export * from './registry';
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import type { BlockFlavourIdentifier } from '@blocksuite/block-std';

export abstract class ToolbarModule {
constructor(public readonly id: ReturnType<typeof BlockFlavourIdentifier>) {}
}
59 changes: 59 additions & 0 deletions blocksuite/affine/shared/src/services/toolbar-service/registry.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import {
type BlockStdScope,
LifeCycleWatcher,
StdIdentifier,
} from '@blocksuite/block-std';
import {
type Container,
createIdentifier,
createScope,
} from '@blocksuite/global/di';
import type { ExtensionType } from '@blocksuite/store';

import type { ToolbarModule } from './module';

export const ToolbarModuleIdentifier = createIdentifier<ToolbarModule>(
'AffineToolbarModuleIdentifier'
);

export const ToolbarModulesIdentifier = createIdentifier<
Map<string, ToolbarModule>
>('AffineToolbarModulesIdentifier');

export const ToolbarRegistryScope = createScope('AffineToolbarRegistryScope');

export const ToolbarRegistryIdentifier =
createIdentifier<ToolbarRegistryExtension>('AffineToolbarRegistryIdentifier');

export function ToolbarModuleExtension(module: ToolbarModule): ExtensionType {
return {
setup: di => {
di.scope(ToolbarRegistryScope).addImpl(
ToolbarModuleIdentifier(module.id.variant),
module
);
},
};
}

export class ToolbarRegistryExtension extends LifeCycleWatcher {
constructor(
std: BlockStdScope,
readonly modules: Map<string, ToolbarModule>
) {
super(std);
}

static override readonly key = 'toolbar-registry';

static override setup(di: Container) {
di.scope(ToolbarRegistryScope)
.addImpl(ToolbarModulesIdentifier, provider =>
provider.getAll(ToolbarModuleIdentifier)
)
.addImpl(ToolbarRegistryIdentifier, this, [
StdIdentifier,
ToolbarModulesIdentifier,
]);
}
}
15 changes: 14 additions & 1 deletion blocksuite/affine/widget-toolbar/src/toolbar.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
import {
ToolbarRegistryIdentifier,
ToolbarRegistryScope,
} from '@blocksuite/affine-shared/services';
import { WidgetComponent } from '@blocksuite/block-std';

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

export class AffineToolbarWidget extends WidgetComponent {}
export class AffineToolbarWidget extends WidgetComponent {
override connectedCallback() {
super.connectedCallback();

const toolbarRegistry = this.std.container
.provider(ToolbarRegistryScope, this.std.provider)
.get(ToolbarRegistryIdentifier);
console.log(toolbarRegistry);
}
}
2 changes: 2 additions & 0 deletions blocksuite/blocks/src/effects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import { effects as widgetDragHandleEffects } from '@blocksuite/affine-widget-dr
import { effects as widgetFrameTitleEffects } from '@blocksuite/affine-widget-frame-title/effects';
import { effects as widgetRemoteSelectionEffects } from '@blocksuite/affine-widget-remote-selection/effects';
import { effects as widgetScrollAnchoringEffects } from '@blocksuite/affine-widget-scroll-anchoring/effects';
import { effects as widgetToolbarEffects } from '@blocksuite/affine-widget-toolbar/effects';
import type { BlockComponent } from '@blocksuite/block-std';
import { effects as stdEffects } from '@blocksuite/block-std/effects';
import { effects as dataViewEffects } from '@blocksuite/data-view/effects';
Expand Down Expand Up @@ -223,6 +224,7 @@ export function effects() {
widgetEdgelessElementToolbarEffects();
widgetRemoteSelectionEffects();
widgetDragHandleEffects();
widgetToolbarEffects();
dataViewEffects();

customElements.define('affine-page-root', PageRootBlockComponent);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
EmbedOptionService,
PageViewportServiceExtension,
ThemeService,
ToolbarRegistryExtension,
} from '@blocksuite/affine-shared/services';
import { AFFINE_DRAG_HANDLE_WIDGET } from '@blocksuite/affine-widget-drag-handle';
import { AFFINE_FRAME_TITLE_WIDGET } from '@blocksuite/affine-widget-frame-title';
Expand Down Expand Up @@ -102,6 +103,7 @@ const EdgelessCommonExtension: ExtensionType[] = [
PageViewportServiceExtension,
RootBlockAdapterExtensions,
FileDropExtension,
ToolbarRegistryExtension,
].flat();

export const EdgelessRootBlockSpec: ExtensionType[] = [
Expand Down
2 changes: 2 additions & 0 deletions blocksuite/blocks/src/root-block/page/page-root-spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
EmbedOptionService,
PageViewportServiceExtension,
ThemeService,
ToolbarRegistryExtension,
} from '@blocksuite/affine-shared/services';
import { AFFINE_DRAG_HANDLE_WIDGET } from '@blocksuite/affine-widget-drag-handle';
import { AFFINE_DOC_REMOTE_SELECTION_WIDGET } from '@blocksuite/affine-widget-remote-selection';
Expand Down Expand Up @@ -83,6 +84,7 @@ export const PageRootBlockSpec: ExtensionType[] = [
DNDAPIExtension,
RootBlockAdapterExtensions,
FileDropExtension,
ToolbarRegistryExtension,
].flat();

export const PreviewPageRootBlockSpec: ExtensionType[] = [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import {
ParagraphBlockSpec,
RefNodeSlotsExtension,
RichTextExtensions,
ToolbarRegistryExtension,
} from '@blocksuite/affine/blocks';
import type { ExtensionType } from '@blocksuite/affine/store';

Expand All @@ -38,6 +39,7 @@ const CommonBlockSpecs: ExtensionType[] = [
AttachmentBlockSpec,
AdapterFactoryExtensions,
FontLoaderService,
ToolbarRegistryExtension,
].flat();

export const DefaultBlockSpecs: ExtensionType[] = [
Expand Down

0 comments on commit 092379f

Please sign in to comment.