diff --git a/blocksuite/affine/widget-drag-handle/src/middleware/new-id-cross-doc.ts b/blocksuite/affine/widget-drag-handle/src/middleware/new-id-cross-doc.ts index 5230cb370e..02ae4bb61a 100644 --- a/blocksuite/affine/widget-drag-handle/src/middleware/new-id-cross-doc.ts +++ b/blocksuite/affine/widget-drag-handle/src/middleware/new-id-cross-doc.ts @@ -1,3 +1,5 @@ +import { DatabaseBlockModel } from '@blocksuite/affine-model'; +import { matchModels } from '@blocksuite/affine-shared/utils'; import type { BlockStdScope } from '@blocksuite/block-std'; import type { TransformerMiddleware } from '@blocksuite/store'; @@ -5,12 +7,38 @@ export const newIdCrossDoc = (std: BlockStdScope): TransformerMiddleware => ({ slots }) => { let samePage = false; + const oldToNewIdMap = new Map(); + slots.beforeImport.on(payload => { if (payload.type === 'slice') { samePage = payload.snapshot.pageId === std.store.id; } if (payload.type === 'block' && !samePage) { - payload.snapshot.id = std.workspace.idGenerator(); + const newId = std.workspace.idGenerator(); + + oldToNewIdMap.set(payload.snapshot.id, newId); + payload.snapshot.id = newId; + } + }); + + slots.afterImport.on(payload => { + if ( + !samePage && + payload.type === 'block' && + matchModels(payload.model, [DatabaseBlockModel]) + ) { + const originalCells = payload.model.cells; + const newCells = { + ...originalCells, + }; + + Object.keys(originalCells).forEach(cellId => { + if (oldToNewIdMap.has(cellId)) { + newCells[oldToNewIdMap.get(cellId)!] = originalCells[cellId]; + } + }); + + payload.model.cells$.value = newCells; } }); };