You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

create-page.ts 1.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import Command from './command'
  2. import history from '../history'
  3. import { Data, Page, PageState } from 'types'
  4. import { v4 as uuid } from 'uuid'
  5. import { current } from 'immer'
  6. import { getSelectedIds } from 'utils/utils'
  7. import storage from 'state/storage'
  8. export default function createPage(data: Data) {
  9. const snapshot = getSnapshot(data)
  10. history.execute(
  11. data,
  12. new Command({
  13. name: 'change_page',
  14. category: 'canvas',
  15. do(data) {
  16. const { page, pageState } = snapshot
  17. data.document.pages[page.id] = page
  18. data.pageStates[page.id] = pageState
  19. data.currentPageId = page.id
  20. storage.savePage(data, data.document.id, page.id)
  21. },
  22. undo(data) {
  23. const { page, currentPageId } = snapshot
  24. delete data.document.pages[page.id]
  25. delete data.pageStates[page.id]
  26. data.currentPageId = currentPageId
  27. },
  28. })
  29. )
  30. }
  31. function getSnapshot(data: Data) {
  32. const { currentPageId } = current(data)
  33. const pages = Object.values(data.document.pages)
  34. const unchanged = pages.filter((page) => page.name.startsWith('Page '))
  35. const id = uuid()
  36. const page: Page = {
  37. type: 'page',
  38. id,
  39. name: `Page ${unchanged.length + 1}`,
  40. childIndex: pages.length,
  41. shapes: {},
  42. }
  43. const pageState: PageState = {
  44. selectedIds: new Set<string>(),
  45. camera: {
  46. point: [0, 0],
  47. zoom: 1,
  48. },
  49. }
  50. return {
  51. currentPageId,
  52. page,
  53. pageState,
  54. }
  55. }