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.7KB

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