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.

storage.ts 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import { Data, Page, PageState } from 'types'
  2. import { setToArray } from 'utils/utils'
  3. const CURRENT_VERSION = 'code_slate_0.0.4'
  4. const DOCUMENT_ID = '0001'
  5. function storageId(label: string, id: string) {
  6. return `${CURRENT_VERSION}_doc_${DOCUMENT_ID}_${label}_${id}`
  7. }
  8. class Storage {
  9. // Saving
  10. load(data: Data, id = CURRENT_VERSION) {
  11. if (typeof window === 'undefined') return
  12. if (typeof localStorage === 'undefined') return
  13. // Load data from local storage
  14. const savedData = localStorage.getItem(id)
  15. if (savedData !== null) {
  16. const restoredData = JSON.parse(savedData)
  17. // Empty shapes in state for each page
  18. for (let key in restoredData.document.pages) {
  19. restoredData.document.pages[key].shapes = {}
  20. }
  21. // Empty page states for each page
  22. for (let key in restoredData.pageStates) {
  23. restoredData.document.pages[key].shapes = {}
  24. }
  25. // Merge restored data into state
  26. Object.assign(data, restoredData)
  27. // Load current page
  28. this.loadPage(data, data.currentPageId)
  29. }
  30. }
  31. save = (data: Data, id = CURRENT_VERSION) => {
  32. if (typeof window === 'undefined') return
  33. if (typeof localStorage === 'undefined') return
  34. const dataToSave: any = { ...data }
  35. // Don't save pageStates
  36. dataToSave.pageStates = {}
  37. // Save current data to local storage
  38. localStorage.setItem(id, JSON.stringify(dataToSave))
  39. // Save current page
  40. this.savePage(data, data.currentPageId)
  41. }
  42. savePage(data: Data, pageId: string) {
  43. if (typeof window === 'undefined') return
  44. if (typeof localStorage === 'undefined') return
  45. // Save page
  46. const page = data.document.pages[pageId]
  47. localStorage.setItem(storageId('page', pageId), JSON.stringify(page))
  48. // Save page state
  49. let currentPageState = {
  50. camera: {
  51. point: [0, 0],
  52. zoom: 1,
  53. },
  54. selectedIds: new Set([]),
  55. ...data.pageStates[pageId],
  56. }
  57. const pageState = {
  58. ...currentPageState,
  59. selectedIds: setToArray(currentPageState.selectedIds),
  60. }
  61. localStorage.setItem(
  62. storageId('pageState', pageId),
  63. JSON.stringify(pageState)
  64. )
  65. }
  66. loadPage(data: Data, pageId: string) {
  67. if (typeof window === 'undefined') return
  68. if (typeof localStorage === 'undefined') return
  69. // Load page and merge into state
  70. const savedPage = localStorage.getItem(storageId('page', pageId))
  71. if (savedPage !== null) {
  72. const restored: Page = JSON.parse(savedPage)
  73. data.document.pages[pageId] = restored
  74. }
  75. // Load page state and merge into state
  76. const savedPageState = localStorage.getItem(storageId('pageState', pageId))
  77. if (savedPageState !== null) {
  78. const restored: PageState = JSON.parse(savedPageState)
  79. restored.selectedIds = new Set(restored.selectedIds)
  80. data.pageStates[pageId] = restored
  81. } else {
  82. data.pageStates[pageId] = {
  83. camera: {
  84. point: [0, 0],
  85. zoom: 1,
  86. },
  87. selectedIds: new Set([]),
  88. }
  89. }
  90. // Empty shapes in state for other pages
  91. for (let key in data.document.pages) {
  92. if (key === pageId) continue
  93. data.document.pages[key].shapes = {}
  94. }
  95. // Empty page states for other pages
  96. for (let key in data.pageStates) {
  97. if (key === pageId) continue
  98. data.document.pages[key].shapes = {}
  99. }
  100. // Update camera
  101. document.documentElement.style.setProperty(
  102. '--camera-zoom',
  103. data.pageStates[data.currentPageId].camera.zoom.toString()
  104. )
  105. }
  106. }
  107. const storage = new Storage()
  108. export default storage