refactor: migrate elements clone from default-tool to extension (#11703)

### Changed
- Add `onRequestElementsClone` action to allow extension to define how to clone gfx elements
This commit is contained in:
doouding
2025-04-22 08:18:23 +00:00
parent 52953ce8e3
commit 21bf009553
6 changed files with 92 additions and 23 deletions
@@ -0,0 +1,32 @@
import { getCommonBoundWithRotation } from '@blocksuite/global/gfx';
import { type GfxModel, InteractivityExtension } from '@blocksuite/std/gfx';
import { createElementsFromClipboardDataCommand } from '../clipboard/command.js';
import { prepareCloneData } from '../utils/clone-utils.js';
export class AltCloneExtension extends InteractivityExtension {
static override key = 'alt-clone';
override mounted(): void {
this.action.onRequestElementsClone(async context => {
const { elements: elementsToClone } = context;
const snapshot = prepareCloneData(elementsToClone, this.std);
const bound = getCommonBoundWithRotation(elementsToClone);
const [_, { createdElementsPromise }] = this.std.command.exec(
createElementsFromClipboardDataCommand,
{
elementsRawData: snapshot,
pasteCenter: bound.center,
}
);
if (!createdElementsPromise) return;
const { canvasElements, blockModels } = await createdElementsPromise;
return {
elements: [...canvasElements, ...blockModels] as GfxModel[],
};
});
}
}