From 5148e6789189fb762cedfe5bcb9610a65d2dc927 Mon Sep 17 00:00:00 2001 From: Saul-Mirone Date: Thu, 13 Mar 2025 06:34:03 +0000 Subject: [PATCH] feat(editor): improve block meta updated event handler (#10815) --- .../src/blocks/paragraph/paragraph-model.ts | 8 +++- .../shared/src/services/block-meta-service.ts | 37 +++++++++++++------ 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/blocksuite/affine/model/src/blocks/paragraph/paragraph-model.ts b/blocksuite/affine/model/src/blocks/paragraph/paragraph-model.ts index 3d88b4579..a2a713c4b 100644 --- a/blocksuite/affine/model/src/blocks/paragraph/paragraph-model.ts +++ b/blocksuite/affine/model/src/blocks/paragraph/paragraph-model.ts @@ -5,6 +5,8 @@ import { type Text, } from '@blocksuite/store'; +import type { BlockMeta } from '../../utils/types'; + export type ParagraphType = | 'text' | 'quote' @@ -19,7 +21,7 @@ export type ParagraphProps = { type: ParagraphType; text: Text; collapsed: boolean; -}; +} & BlockMeta; export const ParagraphBlockSchema = defineBlockSchema({ flavour: 'affine:paragraph', @@ -27,6 +29,10 @@ export const ParagraphBlockSchema = defineBlockSchema({ type: 'text', text: internal.Text(), collapsed: false, + 'meta:createdAt': undefined, + 'meta:createdBy': undefined, + 'meta:updatedAt': undefined, + 'meta:updatedBy': undefined, }), metadata: { version: 1, diff --git a/blocksuite/affine/shared/src/services/block-meta-service.ts b/blocksuite/affine/shared/src/services/block-meta-service.ts index 05cb12194..1732daeea 100644 --- a/blocksuite/affine/shared/src/services/block-meta-service.ts +++ b/blocksuite/affine/shared/src/services/block-meta-service.ts @@ -1,9 +1,13 @@ import type { BlockMeta } from '@blocksuite/affine-model'; import { type BlockModel, StoreExtension } from '@blocksuite/store'; +import { filter, groupBy, mergeMap, throttleTime } from 'rxjs/operators'; import { FeatureFlagService } from './feature-flag-service'; import { WriterInfoProvider } from './user-service'; +// 30 seconds +const BLOCK_META_THROTTLE_TIME = 30 * 1000; + /** * The service is used to add following info to the block. * - createdAt: The time when the block is created. @@ -21,20 +25,27 @@ export class BlockMetaService extends StoreExtension { override loaded() { this.store.disposableGroup.add( - this.store.slots.blockUpdated.subscribe(({ type, id }) => { - if (!this.isBlockMetaEnabled) return; + this.store.slots.blockUpdated + .pipe( + filter(payload => payload.isLocal), + groupBy(payload => `${payload.type}-${payload.id}`), + mergeMap(group => group.pipe(throttleTime(BLOCK_META_THROTTLE_TIME))) + ) + .subscribe(payload => { + const { type, id } = payload; + if (!this.isBlockMetaEnabled) return; - const model = this.store.getBlock(id)?.model; - if (!model) return; + const model = this.store.getBlock(id)?.model; + if (!model) return; - if (type === 'add') { - return this._onBlockCreated(model); - } + if (type === 'add') { + return this._onBlockCreated(model); + } - if (type === 'update') { - return this._onBlockUpdated(model); - } - }) + if (type === 'update') { + return this._onBlockUpdated(model); + } + }) ); } @@ -76,6 +87,8 @@ export class BlockMetaService extends StoreExtension { model['meta:updatedBy'] = writer.id; if (!model['meta:createdAt']) { model['meta:createdAt'] = now; + } + if (!model['meta:createdBy']) { model['meta:createdBy'] = writer.id; } return; @@ -85,6 +98,8 @@ export class BlockMetaService extends StoreExtension { model.props['meta:updatedBy'] = writer.id; if (!model.props['meta:createdAt']) { model.props['meta:createdAt'] = now; + } + if (!model.props['meta:createdBy']) { model.props['meta:createdBy'] = writer.id; } });