view.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import { ref } from "vue";
  2. import { autoSetModeCallback, createTemploraryID, unSetModelUpdate } from './sys'
  3. import { fuseModels } from './fuse-model'
  4. import {
  5. addStoreItem,
  6. deleteStoreItem,
  7. fetchStoreItems,
  8. recoverStoreItems,
  9. saveStoreItems,
  10. updateStoreItem
  11. } from '@/utils'
  12. import {
  13. fetchViews,
  14. postAddView,
  15. postUpdateView,
  16. postDeleteView,
  17. uploadFile
  18. } from '@/api'
  19. import { fuseModel } from '@/model'
  20. import type { View as SView } from '@/api'
  21. import type { ModelType } from '@/model'
  22. export type View = LocalMode<SView, 'cover'>
  23. export type Views = View[]
  24. export const views = ref<Views>([])
  25. export const createView = (view: Partial<View> = {}): View => {
  26. const base = {
  27. id: createTemploraryID(),
  28. title: '视图',
  29. cover: 'https://4dkk.4dage.com/scene_view_data/KK-t-F8e5M46wcQ/images/floor_0.png?t=1659422513133?v=0&rnd=0.9219648338739086&x-oss-process=image/resize,m_fill,w_80,h_60/quality,q_70&rnd=0.25420557086595965',
  30. flyData: '',
  31. num: null,
  32. numType: null,
  33. fusionId: fuseModels.value[0].fusionId,
  34. sort: Math.min(...views.value.map(item => item.sort)) - 1,
  35. ...view,
  36. }
  37. if (typeof view.fusionId === 'number') {
  38. return {
  39. ...base,
  40. ...view,
  41. fusionId: view.fusionId,
  42. num: null,
  43. numType: null
  44. }
  45. } else if (view.num && typeof view.numType === 'number') {
  46. return {
  47. ...base,
  48. num: view.num,
  49. numType: view.numType,
  50. fusionId: null,
  51. }
  52. } else {
  53. return base as View
  54. }
  55. }
  56. export const viewToModelType = (view: View): ModelType => {
  57. if (typeof view.fusionId === 'number') {
  58. return fuseModel
  59. } else {
  60. return { num: view.num!, type: view.numType! }
  61. }
  62. }
  63. let bcViews: Views = []
  64. export const getBackupViews = () => bcViews
  65. export const backupViews = () => {
  66. bcViews = views.value.map(view => ({...view}))
  67. }
  68. export const recoverViews = recoverStoreItems(views, getBackupViews)
  69. export const initialViews = async () => {
  70. const serviceViews = await fetchViews()
  71. unSetModelUpdate(() => views.value = serviceViews)
  72. backupViews()
  73. }
  74. export const addView = addStoreItem(views, async (view) => {
  75. const cover = await uploadFile(view.cover)
  76. return await postAddView({ ...view, cover })
  77. })
  78. export const updateView = updateStoreItem(views, async (view) => {
  79. const cover = await uploadFile(view.cover)
  80. return await postUpdateView({ ...view, cover })
  81. })
  82. export const deleteView = deleteStoreItem(views, view => postDeleteView(view.id))
  83. export const saveViews = saveStoreItems(
  84. views,
  85. getBackupViews,
  86. {
  87. add: addView,
  88. delete: deleteView,
  89. update: updateView
  90. }
  91. )
  92. export const autoSaveViews = autoSetModeCallback(views, {
  93. backup: backupViews,
  94. recovery: recoverViews,
  95. save: async () => {
  96. for (let i = 0; i < views.value.length; i++) {
  97. views.value[i].sort = i
  98. }
  99. await saveViews()
  100. }
  101. })