tldraw/state/sessions/edit-session.ts

48 lines
1.3 KiB
TypeScript
Raw Normal View History

2021-06-21 21:35:28 +00:00
import { Data, Shape } from 'types'
import BaseSession from './base-session'
import commands from 'state/commands'
2021-06-21 21:35:28 +00:00
import { getShapeUtils } from 'state/shape-utils'
2021-06-29 12:00:59 +00:00
import tld from 'utils/tld'
2021-06-29 14:54:46 +00:00
import { deepClone } from 'utils'
export default class EditSession extends BaseSession {
snapshot: EditSnapshot
constructor(data: Data) {
super(data)
this.snapshot = getEditSnapshot(data)
}
2021-06-21 21:35:28 +00:00
update(data: Data, change: Partial<Shape>): void {
const initialShape = this.snapshot.initialShape
2021-06-29 12:00:59 +00:00
const shape = tld.getShape(data, initialShape.id)
const utils = getShapeUtils(shape)
Object.entries(change).forEach(([key, value]) => {
utils.setProperty(shape, key as keyof Shape, value as Shape[keyof Shape])
})
}
2021-06-21 21:35:28 +00:00
cancel(data: Data): void {
const initialShape = this.snapshot.initialShape
2021-06-29 12:00:59 +00:00
const page = tld.getPage(data)
page.shapes[initialShape.id] = initialShape
}
2021-06-21 21:35:28 +00:00
complete(data: Data): void {
commands.edit(data, this.snapshot, getEditSnapshot(data))
}
}
2021-06-21 21:35:28 +00:00
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
export function getEditSnapshot(data: Data) {
2021-06-29 14:54:46 +00:00
const initialShape = deepClone(tld.getSelectedShapes(data)[0])
return {
currentPageId: data.currentPageId,
initialShape,
}
}
export type EditSnapshot = ReturnType<typeof getEditSnapshot>