您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

create-page.ts 1.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import Command from './command'
  2. import history from '../history'
  3. import { Data, Page, PageState } from 'types'
  4. import { uniqueId } from 'utils/utils'
  5. import { current } from 'immer'
  6. import storage from 'state/storage'
  7. export default function createPage(data: Data) {
  8. const snapshot = getSnapshot(data)
  9. history.execute(
  10. data,
  11. new Command({
  12. name: 'change_page',
  13. category: 'canvas',
  14. do(data) {
  15. const { page, pageState } = 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. },
  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. storage.saveDocumentToLocalStorage(data)
  28. },
  29. })
  30. )
  31. }
  32. function getSnapshot(data: Data) {
  33. const { currentPageId } = current(data)
  34. const pages = Object.values(data.document.pages)
  35. const unchanged = pages.filter((page) => page.name.startsWith('Page '))
  36. const id = uniqueId()
  37. const page: Page = {
  38. type: 'page',
  39. id,
  40. name: `Page ${unchanged.length + 1}`,
  41. childIndex: pages.length,
  42. shapes: {},
  43. }
  44. const pageState: PageState = {
  45. id,
  46. selectedIds: new Set([]),
  47. camera: {
  48. point: [0, 0],
  49. zoom: 1,
  50. },
  51. }
  52. return {
  53. currentPageId,
  54. page,
  55. pageState,
  56. }
  57. }