mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-15 05:37:32 +00:00
70 lines
1.9 KiB
TypeScript
70 lines
1.9 KiB
TypeScript
import type { TldrawCommand } from '@toeverything/components/board-types';
|
|
import { Utils } from '@tldraw/core';
|
|
import type { TldrawApp } from '@toeverything/components/board-state';
|
|
|
|
export function duplicatePage(app: TldrawApp, pageId: string): TldrawCommand {
|
|
const newId = Utils.uniqueId();
|
|
const {
|
|
currentPageId,
|
|
page,
|
|
pageState: { camera },
|
|
} = app;
|
|
|
|
const nextPage = {
|
|
...page,
|
|
id: newId,
|
|
name: page.name + ' Copy',
|
|
shapes: Object.fromEntries(
|
|
Object.entries(page.shapes).map(([id, shape]) => {
|
|
return [
|
|
id,
|
|
{
|
|
...shape,
|
|
parentId:
|
|
shape.parentId === pageId ? newId : shape.parentId,
|
|
},
|
|
];
|
|
})
|
|
),
|
|
};
|
|
|
|
return {
|
|
id: 'duplicate_page',
|
|
before: {
|
|
appState: {
|
|
currentPageId,
|
|
},
|
|
document: {
|
|
pages: {
|
|
[newId]: undefined,
|
|
},
|
|
pageStates: {
|
|
[newId]: undefined,
|
|
},
|
|
},
|
|
},
|
|
after: {
|
|
appState: {
|
|
currentPageId: newId,
|
|
},
|
|
document: {
|
|
pages: {
|
|
[newId]: nextPage,
|
|
},
|
|
pageStates: {
|
|
[newId]: {
|
|
...page,
|
|
id: newId,
|
|
selectedIds: [],
|
|
camera: { ...camera },
|
|
editingId: undefined,
|
|
bindingId: undefined,
|
|
hoveredId: undefined,
|
|
pointedId: undefined,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
}
|