mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-08-23 21:06:22 +08:00
bc67766bb9
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Improved resource management by introducing explicit cleanup for various middleware components, ensuring that resources are properly released when no longer needed. - **Refactor** - Updated middleware logic to support cleanup functions, enhancing the stability and performance of the application by preventing potential memory leaks. - **Chores** - Enhanced lifecycle management in core systems to automatically dispose of resources when appropriate. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
54 lines
1.6 KiB
TypeScript
54 lines
1.6 KiB
TypeScript
import { DatabaseBlockModel } from '@blocksuite/affine-model';
|
|
import { matchModels } from '@blocksuite/affine-shared/utils';
|
|
import type { BlockStdScope } from '@blocksuite/std';
|
|
import type { TransformerMiddleware } from '@blocksuite/store';
|
|
|
|
export const newIdCrossDoc =
|
|
(std: BlockStdScope): TransformerMiddleware =>
|
|
({ slots }) => {
|
|
let samePage = false;
|
|
const oldToNewIdMap = new Map<string, string>();
|
|
|
|
const beforeImportSliceSubscription = slots.beforeImport.subscribe(
|
|
payload => {
|
|
if (payload.type === 'slice') {
|
|
samePage = payload.snapshot.pageId === std.store.id;
|
|
}
|
|
if (payload.type === 'block' && !samePage) {
|
|
const newId = std.workspace.idGenerator();
|
|
|
|
oldToNewIdMap.set(payload.snapshot.id, newId);
|
|
payload.snapshot.id = newId;
|
|
}
|
|
}
|
|
);
|
|
|
|
const afterImportBlockSubscription = slots.afterImport.subscribe(
|
|
payload => {
|
|
if (
|
|
!samePage &&
|
|
payload.type === 'block' &&
|
|
matchModels(payload.model, [DatabaseBlockModel])
|
|
) {
|
|
const originalCells = payload.model.props.cells;
|
|
const newCells = {
|
|
...originalCells,
|
|
};
|
|
|
|
Object.keys(originalCells).forEach(cellId => {
|
|
if (oldToNewIdMap.has(cellId)) {
|
|
newCells[oldToNewIdMap.get(cellId)!] = originalCells[cellId];
|
|
}
|
|
});
|
|
|
|
payload.model.props.cells$.value = newCells;
|
|
}
|
|
}
|
|
);
|
|
|
|
return () => {
|
|
beforeImportSliceSubscription.unsubscribe();
|
|
afterImportBlockSubscription.unsubscribe();
|
|
};
|
|
};
|