mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-14 21:27:20 +00:00
37 lines
1.1 KiB
TypeScript
37 lines
1.1 KiB
TypeScript
import type { PropertyMetaConfig } from '@blocksuite/data-view';
|
|
import type { Disposable } from '@blocksuite/global/slot';
|
|
import type { Block, BlockModel } from '@blocksuite/store';
|
|
|
|
type PropertyMeta<
|
|
T extends BlockModel = BlockModel,
|
|
Value = unknown,
|
|
ColumnData extends NonNullable<unknown> = NonNullable<unknown>,
|
|
> = {
|
|
name: string;
|
|
key: string;
|
|
metaConfig: PropertyMetaConfig<string, ColumnData, Value>;
|
|
getColumnData?: (block: T) => ColumnData;
|
|
setColumnData?: (block: T, data: ColumnData) => void;
|
|
get: (block: T) => Value;
|
|
set?: (block: T, value: Value) => void;
|
|
updated: (block: T, callback: () => void) => Disposable;
|
|
};
|
|
export type BlockMeta<T extends BlockModel = BlockModel> = {
|
|
selector: (block: Block) => boolean;
|
|
properties: PropertyMeta<T>[];
|
|
};
|
|
export const createBlockMeta = <T extends BlockModel>(
|
|
options: Omit<BlockMeta<T>, 'properties'>
|
|
) => {
|
|
const meta: BlockMeta = {
|
|
...options,
|
|
properties: [],
|
|
};
|
|
return {
|
|
...meta,
|
|
addProperty: <Value>(property: PropertyMeta<T, Value>) => {
|
|
meta.properties.push(property as PropertyMeta);
|
|
},
|
|
};
|
|
};
|