Files
AFFiNE-Mirror/blocksuite/affine/blocks/root/src/view.ts
T
Saul-Mirone d6ab958e15 feat(editor): root block extension (#12063)
Closes: BS-3202

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **New Features**
  - Introduced new root block store and view extensions, enhancing modularity and integration options for root block functionality.
  - Exported the EdgelessLocker class for broader usage.

- **Improvements**
  - Updated export paths for root block modules, enabling clearer and more flexible module access.
  - Enhanced view extension setup to better tailor user interface and interactions based on context.

- **Removals**
  - Removed legacy migrating store and view extension logic, streamlining extension management and reducing unused code.
  - Removed multiple deprecated block specifications and common extension collections to simplify the codebase.
  - Deleted AI page root block specification, retaining only lifecycle watcher functionality.

- **Chores**
  - Updated dependencies and project references to support new extension loader integration.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-04-29 17:20:42 +08:00

102 lines
2.9 KiB
TypeScript

import {
type ViewExtensionContext,
ViewExtensionProvider,
} from '@blocksuite/affine-ext-loader';
import { NoteBlockSchema } from '@blocksuite/affine-model';
import {
ToolbarModuleExtension,
ViewportElementExtension,
} from '@blocksuite/affine-shared/services';
import {
BlockFlavourIdentifier,
BlockViewExtension,
FlavourExtension,
} from '@blocksuite/std';
import { literal } from 'lit/static-html.js';
import { PageClipboard, ReadOnlyClipboard } from './clipboard';
import { builtinToolbarConfig } from './configs/toolbar';
import { EdgelessClipboardController, EdgelessRootService } from './edgeless';
import { EdgelessElementToolbarExtension } from './edgeless/configs/toolbar';
import {
edgelessDraggingAreaWidget,
EdgelessLocker,
edgelessSelectedRectWidget,
noteSlicerWidget,
} from './edgeless/edgeless-root-spec';
import { AltCloneExtension } from './edgeless/interact-extensions/clone-ext';
import { effects } from './effects';
import { fallbackKeymap } from './keyboard/keymap';
export class RootViewExtension extends ViewExtensionProvider {
override name = 'affine-root-block';
override effect(): void {
super.effect();
effects();
}
override setup(context: ViewExtensionContext) {
super.setup(context);
context.register([
FlavourExtension('affine:page'),
fallbackKeymap,
ToolbarModuleExtension({
id: BlockFlavourIdentifier(NoteBlockSchema.model.flavour),
config: builtinToolbarConfig,
}),
]);
if (
context.scope === 'preview-page' ||
context.scope === 'preview-edgeless'
) {
context.register(ReadOnlyClipboard);
}
if (this.isEdgeless(context.scope)) {
this._setupEdgeless(context);
return;
}
this._setupPage(context);
}
private readonly _setupPage = (context: ViewExtensionContext) => {
context.register(ViewportElementExtension('.affine-page-viewport'));
if (context.scope === 'preview-page') {
context.register(
BlockViewExtension('affine:page', literal`affine-preview-root`)
);
return;
}
context.register(
BlockViewExtension('affine:page', literal`affine-page-root`)
);
context.register(PageClipboard);
};
private readonly _setupEdgeless = (context: ViewExtensionContext) => {
context.register([
EdgelessRootService,
ViewportElementExtension('.affine-edgeless-viewport'),
]);
if (context.scope === 'preview-edgeless') {
context.register([
BlockViewExtension(
'affine:page',
literal`affine-edgeless-root-preview`
),
EdgelessLocker,
]);
return;
}
context.register([
BlockViewExtension('affine:page', literal`affine-edgeless-root`),
edgelessDraggingAreaWidget,
noteSlicerWidget,
edgelessSelectedRectWidget,
EdgelessClipboardController,
AltCloneExtension,
]);
context.register(EdgelessElementToolbarExtension);
};
}