refactor(editor): remove block models global type (#10086)

This commit is contained in:
Saul-Mirone
2025-02-11 11:00:57 +00:00
parent a725df6ebe
commit 39eb8625d6
157 changed files with 402 additions and 621 deletions
@@ -29,7 +29,7 @@ import {
isInsidePageEditor,
isTopLevelBlock,
isUrlInClipboard,
matchFlavours,
matchModels,
referenceToNode,
} from '@blocksuite/affine-shared/utils';
import type {
@@ -41,6 +41,7 @@ import type {
import {
compareLayer,
type GfxCompatibleProps,
type GfxModel,
type SerializedElement,
SortOrder,
} from '@blocksuite/block-std/gfx';
@@ -995,7 +996,7 @@ export class EdgelessClipboardController extends PageClipboard {
for (const nodeElement of nodeElements) {
await _drawTopLevelBlock(nodeElement);
if (matchFlavours(nodeElement, [FrameBlockModel])) {
if (matchModels(nodeElement, [FrameBlockModel])) {
const blocksInsideFrame: BlockSuite.EdgelessBlockModelType[] = [];
this.edgeless.service.frame
.getElementsInFrameBound(nodeElement, false)
@@ -1153,21 +1154,21 @@ export class EdgelessClipboardController extends PageClipboard {
}
private _updatePastedElementsIndex(
elements: BlockSuite.EdgelessModel[],
elements: GfxModel[],
originalIndexes: Map<string, string>
) {
function compare(a: BlockSuite.EdgelessModel, b: BlockSuite.EdgelessModel) {
function compare(a: GfxModel, b: GfxModel) {
if (a instanceof SurfaceGroupLikeModel && a.hasDescendant(b)) {
return SortOrder.BEFORE;
} else if (b instanceof SurfaceGroupLikeModel && b.hasDescendant(a)) {
return SortOrder.AFTER;
} else {
const aGroups = a.groups as BlockSuite.SurfaceGroupLikeModel[];
const bGroups = b.groups as BlockSuite.SurfaceGroupLikeModel[];
const aGroups = a.groups as SurfaceGroupLikeModel[];
const bGroups = b.groups as SurfaceGroupLikeModel[];
let i = 1;
let aGroup: BlockSuite.EdgelessModel | undefined = nToLast(aGroups, i);
let bGroup: BlockSuite.EdgelessModel | undefined = nToLast(bGroups, i);
let aGroup: GfxModel | undefined = nToLast(aGroups, i);
let bGroup: GfxModel | undefined = nToLast(bGroups, i);
while (aGroup === bGroup && aGroup) {
++i;
@@ -1246,7 +1247,7 @@ export class EdgelessClipboardController extends PageClipboard {
const blockModels: BlockSuite.EdgelessBlockModelType[] = [];
const canvasElements: BlockSuite.SurfaceModel[] = [];
const allElements: BlockSuite.EdgelessModel[] = [];
const allElements: GfxModel[] = [];
for (const data of elementsRawData) {
const { data: blockSnapshot } = BlockSnapshotSchema.safeParse(data);
@@ -1371,7 +1372,7 @@ export class EdgelessClipboardController extends PageClipboard {
}
export async function prepareClipboardData(
selectedAll: BlockSuite.EdgelessModel[],
selectedAll: GfxModel[],
std: BlockStdScope
) {
const job = new Transformer({
@@ -958,11 +958,7 @@ export class EdgelessSelectedRectWidget extends WidgetComponent<
* Related issue: https://linear.app/affine-design/issue/BS-1009/
* @deprecated
*/
#adjustAIChat(
element: BlockSuite.EdgelessModel,
bound: Bound,
direction: HandleDirection
) {
#adjustAIChat(element: GfxModel, bound: Bound, direction: HandleDirection) {
const curBound = Bound.deserialize(element.xywh);
let scale = 1;
@@ -1165,7 +1161,7 @@ export class EdgelessSelectedRectWidget extends WidgetComponent<
}
#adjustProportional(
element: BlockSuite.EdgelessModel,
element: GfxModel,
bound: Bound,
direction: HandleDirection
) {
@@ -1263,7 +1259,7 @@ export class EdgelessSelectedRectWidget extends WidgetComponent<
}
#adjustUseFallback(
element: BlockSuite.EdgelessModel,
element: GfxModel,
bound: Bound,
_direction: HandleDirection
) {
@@ -1293,7 +1289,7 @@ export class EdgelessSelectedRectWidget extends WidgetComponent<
);
}
private _isProportionalElement(element: BlockSuite.EdgelessModel) {
private _isProportionalElement(element: GfxModel) {
return (
isAttachmentBlock(element) ||
isImageBlock(element) ||
@@ -1306,7 +1302,7 @@ export class EdgelessSelectedRectWidget extends WidgetComponent<
);
}
private _shouldRenderSelection(elements?: BlockSuite.EdgelessModel[]) {
private _shouldRenderSelection(elements?: GfxModel[]) {
elements = elements ?? this.selection.selectedElements;
return elements.length > 0 && !this.selection.editing;
}
@@ -19,7 +19,7 @@ import {
TelemetryProvider,
} from '@blocksuite/affine-shared/services';
import { LassoMode } from '@blocksuite/affine-shared/types';
import { matchFlavours } from '@blocksuite/affine-shared/utils';
import { matchModels } from '@blocksuite/affine-shared/utils';
import { SurfaceSelection, TextSelection } from '@blocksuite/block-std';
import {
GfxBlockElementModel,
@@ -134,7 +134,7 @@ export class EdgelessPageKeyboardManager extends PageKeyboardManager {
if (
selection.selectedElements.length === 1 &&
selection.firstElement instanceof GfxBlockElementModel &&
matchFlavours(selection.firstElement as GfxBlockElementModel, [
matchModels(selection.firstElement as GfxBlockElementModel, [
NoteBlockModel,
])
) {
@@ -260,7 +260,7 @@ export class EdgelessPageKeyboardManager extends PageKeyboardManager {
block =>
block.group === null &&
!(
matchFlavours(block, [NoteBlockModel]) &&
matchModels(block, [NoteBlockModel]) &&
block.displayMode === NoteDisplayMode.DocOnly
)
)
@@ -24,7 +24,7 @@ import {
import type { Viewport } from '@blocksuite/affine-shared/types';
import {
isTouchPadPinchEvent,
matchFlavours,
matchModels,
requestConnectedFrame,
requestThrottledConnectedFrame,
} from '@blocksuite/affine-shared/utils';
@@ -350,7 +350,7 @@ export class EdgelessRootBlockComponent extends BlockComponent<
const primaryMode = std.get(DocModeProvider).getPrimaryMode(this.doc.id);
const note = this.model.children.find(
(child): child is NoteBlockModel =>
matchFlavours(child, [NoteBlockModel]) &&
matchModels(child, [NoteBlockModel]) &&
child.displayMode !== NoteDisplayMode.EdgelessOnly
);
@@ -169,7 +169,7 @@ export class EdgelessRootService extends RootService implements SurfaceContext {
);
}
createGroup(elements: BlockSuite.EdgelessModel[] | string[]) {
createGroup(elements: GfxModel[] | string[]) {
const groups = this.elements.filter(
el => el.type === 'group'
) as GroupElementModel[];
@@ -277,7 +277,7 @@ export class EdgelessRootService extends RootService implements SurfaceContext {
return this.layer.generateIndex();
}
getConnectors(element: BlockSuite.EdgelessModel | string) {
getConnectors(element: GfxModel | string) {
const id = typeof element === 'string' ? element : element.id;
return this.surface.getConnectors(id) as ConnectorElementModel[];
@@ -298,11 +298,11 @@ export class EdgelessRootService extends RootService implements SurfaceContext {
x: number,
y: number,
options?: PointTestOptions
): BlockSuite.EdgelessModel | null {
): GfxModel | null {
return this.gfx.getElementInGroup(x, y, options);
}
removeElement(id: string | BlockSuite.EdgelessModel) {
removeElement(id: string | GfxModel) {
id = typeof id === 'string' ? id : id.id;
const el = this.crud.getElementById(id);
@@ -323,10 +323,7 @@ export class EdgelessRootService extends RootService implements SurfaceContext {
}
}
reorderElement(
element: BlockSuite.EdgelessModel,
direction: ReorderingDirection
) {
reorderElement(element: GfxModel, direction: ReorderingDirection) {
const index = this.layer.getReorderedIndex(element, direction);
// block should be updated in transaction
@@ -390,7 +390,7 @@ export class EdgelessFrameManager extends GfxExtension {
.map(id => this.gfx.getElementById(id))
.filter(element => element !== null);
return childElements as BlockSuite.EdgelessModel[];
return childElements as GfxModel[];
}
/**
@@ -18,7 +18,7 @@ import {
} from '@blocksuite/affine-model';
import { TelemetryProvider } from '@blocksuite/affine-shared/services';
import type { PointerEventState } from '@blocksuite/block-std';
import { BaseTool } from '@blocksuite/block-std/gfx';
import { BaseTool, type GfxModel } from '@blocksuite/block-std/gfx';
import type { IBound, IVec } from '@blocksuite/global/utils';
import { Bound } from '@blocksuite/global/utils';
@@ -189,7 +189,7 @@ export class ConnectorTool extends BaseTool<ConnectorToolOptions> {
this._overlay?.clear();
}
quickConnect(point: IVec, element: BlockSuite.EdgelessModel) {
quickConnect(point: IVec, element: GfxModel) {
this._startPoint = this.gfx.viewport.toModelCoord(point[0], point[1]);
this._mode = ConnectorToolMode.Quick;
this._sourceBounds = Bound.deserialize(element.xywh);
@@ -1,6 +1,10 @@
/* oxlint-disable @typescript-eslint/no-non-null-assertion */
import type { PointerEventState } from '@blocksuite/block-std';
import { BaseTool, MouseButton } from '@blocksuite/block-std/gfx';
import {
BaseTool,
type GfxModel,
MouseButton,
} from '@blocksuite/block-std/gfx';
import { IS_MAC } from '@blocksuite/global/env';
import {
Bound,
@@ -141,10 +145,7 @@ export class CopilotTool extends BaseTool {
this.gfx.tool.setTool('default');
}
updateDragPointsWith(
selectedElements: BlockSuite.EdgelessModel[],
padding = 0
) {
updateDragPointsWith(selectedElements: GfxModel[], padding = 0) {
const bounds = getCommonBoundWithRotation(selectedElements).expand(
padding / this.gfx.viewport.zoom
);
@@ -153,10 +154,7 @@ export class CopilotTool extends BaseTool {
this.dragLastPoint = bounds.br as [number, number];
}
updateSelectionWith(
selectedElements: BlockSuite.EdgelessModel[],
padding = 0
) {
updateSelectionWith(selectedElements: GfxModel[], padding = 0) {
const { selection } = this.gfx;
selection.clear();
@@ -5,7 +5,7 @@ import {
} from '@blocksuite/affine-block-surface';
import { isTopLevelBlock } from '@blocksuite/affine-shared/utils';
import type { PointerEventState } from '@blocksuite/block-std';
import { BaseTool } from '@blocksuite/block-std/gfx';
import { BaseTool, type GfxModel } from '@blocksuite/block-std/gfx';
import {
Bound,
getStroke,
@@ -28,11 +28,11 @@ class EraserOverlay extends Overlay {
export class EraserTool extends BaseTool {
static override toolName = 'eraser';
private _erasable = new Set<BlockSuite.EdgelessModel>();
private _erasable = new Set<GfxModel>();
private _eraserPoints: IVec[] = [];
private readonly _eraseTargets = new Set<BlockSuite.EdgelessModel>();
private readonly _eraseTargets = new Set<GfxModel>();
private readonly _loop = () => {
const now = Date.now();
@@ -211,7 +211,7 @@ export class TemplateJob {
assertExists(modelData);
doc.addBlock(
modelData.flavour as BlockSuite.Flavour,
modelData.flavour,
{
...modelData.props,
id: modelData.id,
@@ -10,6 +10,7 @@ import type {
import { getElementsWithoutGroup } from '@blocksuite/affine-shared/utils';
import {
generateKeyBetweenV2,
type GfxModel,
type SerializedElement,
} from '@blocksuite/block-std/gfx';
import { getCommonBoundWithRotation, groupBy } from '@blocksuite/global/utils';
@@ -28,7 +29,7 @@ import {
const offset = 10;
export async function duplicate(
edgeless: EdgelessRootBlockComponent,
elements: BlockSuite.EdgelessModel[],
elements: GfxModel[],
select = true
) {
const { clipboardController } = edgeless;
@@ -54,7 +55,7 @@ export async function duplicate(
});
}
}
export const splitElements = (elements: BlockSuite.EdgelessModel[]) => {
export const splitElements = (elements: GfxModel[]) => {
const { notes, frames, shapes, images, edgelessTexts, embedSyncedDocs } =
groupBy(getElementsWithoutGroup(elements), element => {
if (isNoteBlock(element)) {
@@ -1,4 +1,5 @@
import { isNoteBlock } from '@blocksuite/affine-block-surface';
import type { GfxModel } from '@blocksuite/block-std/gfx';
import type { Connectable } from '../../../_common/utils/index.js';
import type { EdgelessRootBlockComponent } from '../index.js';
@@ -10,7 +11,7 @@ import { isConnectable } from './query.js';
*/
export function deleteElements(
edgeless: EdgelessRootBlockComponent,
elements: BlockSuite.EdgelessModel[]
elements: GfxModel[]
) {
const set = new Set(elements);
const { service } = edgeless;
@@ -39,14 +39,12 @@ import type { BlockModel } from '@blocksuite/store';
import type { Connectable } from '../../../_common/utils/index.js';
export function isMindmapNode(
element: GfxBlockElementModel | BlockSuite.EdgelessModel | null
) {
export function isMindmapNode(element: GfxBlockElementModel | GfxModel | null) {
return element?.group instanceof MindmapElementModel;
}
export function isEdgelessTextBlock(
element: BlockModel | BlockSuite.EdgelessModel | null
element: BlockModel | GfxModel | null
): element is EdgelessTextBlockModel {
return (
!!element &&
@@ -60,7 +58,7 @@ export function isFrameBlock(element: unknown): element is FrameBlockModel {
}
export function isImageBlock(
element: BlockModel | BlockSuite.EdgelessModel | null
element: BlockModel | GfxModel | null
): element is ImageBlockModel {
return (
!!element && 'flavour' in element && element.flavour === 'affine:image'
@@ -68,7 +66,7 @@ export function isImageBlock(
}
export function isAttachmentBlock(
element: BlockModel | BlockSuite.EdgelessModel | null
element: BlockModel | GfxModel | null
): element is AttachmentBlockModel {
return (
!!element && 'flavour' in element && element.flavour === 'affine:attachment'
@@ -76,7 +74,7 @@ export function isAttachmentBlock(
}
export function isBookmarkBlock(
element: BlockModel | BlockSuite.EdgelessModel | null
element: BlockModel | GfxModel | null
): element is BookmarkBlockModel {
return (
!!element && 'flavour' in element && element.flavour === 'affine:bookmark'
@@ -84,7 +82,7 @@ export function isBookmarkBlock(
}
export function isEmbeddedBlock(
element: BlockModel | BlockSuite.EdgelessModel | null
element: BlockModel | GfxModel | null
): element is EmbedBlockModel {
return (
!!element && 'flavour' in element && /affine:embed-*/.test(element.flavour)
@@ -98,9 +96,7 @@ export function isEmbeddedBlock(
* Related issue: https://linear.app/affine-design/issue/BS-1009/
* @deprecated
*/
export function isAIChatBlock(
element: BlockModel | BlockSuite.EdgelessModel | null
) {
export function isAIChatBlock(element: BlockModel | GfxModel | null) {
return (
!!element &&
'flavour' in element &&
@@ -108,9 +104,7 @@ export function isAIChatBlock(
);
}
export function isEmbeddedLinkBlock(
element: BlockModel | BlockSuite.EdgelessModel | null
) {
export function isEmbeddedLinkBlock(element: BlockModel | GfxModel | null) {
return (
isEmbeddedBlock(element) &&
!isEmbedSyncedDocBlock(element) &&
@@ -119,7 +113,7 @@ export function isEmbeddedLinkBlock(
}
export function isEmbedGithubBlock(
element: BlockModel | BlockSuite.EdgelessModel | null
element: BlockModel | GfxModel | null
): element is EmbedGithubModel {
return (
!!element &&
@@ -129,7 +123,7 @@ export function isEmbedGithubBlock(
}
export function isEmbedYoutubeBlock(
element: BlockModel | BlockSuite.EdgelessModel | null
element: BlockModel | GfxModel | null
): element is EmbedYoutubeModel {
return (
!!element &&
@@ -139,7 +133,7 @@ export function isEmbedYoutubeBlock(
}
export function isEmbedLoomBlock(
element: BlockModel | BlockSuite.EdgelessModel | null
element: BlockModel | GfxModel | null
): element is EmbedLoomModel {
return (
!!element && 'flavour' in element && element.flavour === 'affine:embed-loom'
@@ -147,7 +141,7 @@ export function isEmbedLoomBlock(
}
export function isEmbedFigmaBlock(
element: BlockModel | BlockSuite.EdgelessModel | null
element: BlockModel | GfxModel | null
): element is EmbedFigmaModel {
return (
!!element &&
@@ -157,7 +151,7 @@ export function isEmbedFigmaBlock(
}
export function isEmbedLinkedDocBlock(
element: BlockModel | BlockSuite.EdgelessModel | null
element: BlockModel | GfxModel | null
): element is EmbedLinkedDocModel {
return (
!!element &&
@@ -167,7 +161,7 @@ export function isEmbedLinkedDocBlock(
}
export function isEmbedSyncedDocBlock(
element: BlockModel | BlockSuite.EdgelessModel | null
element: BlockModel | GfxModel | null
): element is EmbedSyncedDocModel {
return (
!!element &&
@@ -177,7 +171,7 @@ export function isEmbedSyncedDocBlock(
}
export function isEmbedHtmlBlock(
element: BlockModel | BlockSuite.EdgelessModel | null
element: BlockModel | GfxModel | null
): element is EmbedHtmlModel {
return (
!!element && 'flavour' in element && element.flavour === 'affine:embed-html'
@@ -191,7 +185,7 @@ export function isCanvasElement(
}
export function isCanvasElementWithText(
element: BlockSuite.EdgelessModel
element: GfxModel
): element is CanvasElementWithText {
return (
element instanceof TextElementModel || element instanceof ShapeElementModel
@@ -199,7 +193,7 @@ export function isCanvasElementWithText(
}
export function isConnectable(
element: BlockSuite.EdgelessModel | null
element: GfxModel | null
): element is Connectable {
return !!element && element.connectable;
}
@@ -253,7 +247,7 @@ export type SelectableProps = {
};
export function getSelectableBounds(
selected: BlockSuite.EdgelessModel[]
selected: GfxModel[]
): Map<string, SelectableProps> {
const bounds = new Map();
getElementsWithoutGroup(selected).forEach(ele => {
@@ -4,7 +4,7 @@ import type {
} from '@blocksuite/affine-block-surface';
import { getSurfaceBlock, Overlay } from '@blocksuite/affine-block-surface';
import type { ConnectorElementModel } from '@blocksuite/affine-model';
import type { GfxController } from '@blocksuite/block-std/gfx';
import type { GfxController, GfxModel } from '@blocksuite/block-std/gfx';
import { BlockSuiteError, ErrorCode } from '@blocksuite/global/exceptions';
import { Bound, Point } from '@blocksuite/global/utils';
@@ -413,10 +413,7 @@ export class EdgelessSnapManager extends Overlay {
});
}
setupAlignables(
alignables: BlockSuite.EdgelessModel[],
exclude: BlockSuite.EdgelessModel[] = []
): Bound {
setupAlignables(alignables: GfxModel[], exclude: GfxModel[] = []): Bound {
if (alignables.length === 0) return new Bound();
const connectors = alignables.filter(isConnectable).reduce((prev, el) => {
@@ -437,20 +434,17 @@ export class EdgelessSnapManager extends Overlay {
const canvasElements = this.gfx.layer.canvasElements;
const excludes = new Set([...alignables, ...exclude, ...connectors]);
this._alignableBounds = [];
(
[
...this.gfx.layer.blocks,
...canvasElements,
] as BlockSuite.EdgelessModel[]
).forEach(alignable => {
const bounds = alignable.elementBound;
if (
viewportBounds.isOverlapWithBound(bounds) &&
!excludes.has(alignable)
) {
this._alignableBounds.push(bounds);
([...this.gfx.layer.blocks, ...canvasElements] as GfxModel[]).forEach(
alignable => {
const bounds = alignable.elementBound;
if (
viewportBounds.isOverlapWithBound(bounds) &&
!excludes.has(alignable)
) {
this._alignableBounds.push(bounds);
}
}
});
);
return alignables.reduce((prev, element) => {
const bounds = element.elementBound;