import type { Constructor } from '@blocksuite/global/utils'; import type { GfxCompatibleProps } from '@blocksuite/std/gfx'; import { GfxCompatible } from '@blocksuite/std/gfx'; import { type BaseBlockTransformer, type BlockModel, defineBlockSchema, type InternalPrimitives, } from '@blocksuite/store'; import type { BlockMeta } from './types'; export type EmbedProps = Props & GfxCompatibleProps & BlockMeta; export function defineEmbedModel< Props extends object, T extends Constructor> = Constructor>, >(BlockModelSuperClass: T) { return GfxCompatible>( BlockModelSuperClass as Constructor>> ); } export type EmbedBlockModel = BlockModel>; export function createEmbedBlockSchema< Props extends object, Model extends EmbedBlockModel, Transformer extends BaseBlockTransformer< EmbedProps > = BaseBlockTransformer>, >({ name, version, toModel, props, transformer, }: { name: string; version: number; toModel: () => Model; props?: (internalPrimitives: InternalPrimitives) => Props; transformer?: () => Transformer; }) { return defineBlockSchema({ flavour: `affine:embed-${name}`, props: internalPrimitives => { const userProps = props?.(internalPrimitives); return { index: 'a0', xywh: '[0,0,0,0]', lockedBySelf: false, rotate: 0, 'meta:createdAt': undefined, 'meta:updatedAt': undefined, 'meta:createdBy': undefined, 'meta:updatedBy': undefined, ...userProps, } as unknown as EmbedProps; }, metadata: { version, role: 'content', }, toModel, transformer, }); }