Files
AFFiNE-Mirror/blocksuite/affine/blocks/root/src/edgeless/interact-extensions/clone-ext.ts
T
doouding 21bf009553 refactor: migrate elements clone from default-tool to extension (#11703)
### Changed
- Add `onRequestElementsClone` action to allow extension to define how to clone gfx elements
2025-04-22 08:18:23 +00:00

33 lines
1.1 KiB
TypeScript

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[],
};
});
}
}