model.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import { computed, ref, watchPostEffect } from 'vue'
  2. import { autoSetModeCallback } from './sys'
  3. import { showModelsMapStack, custom } from '@/env'
  4. import {
  5. fetchModels,
  6. postAddModel,
  7. postDeleteModel,
  8. postUpdateModels
  9. } from '@/api'
  10. import {
  11. deleteStoreItem,
  12. addStoreItem,
  13. updateStoreItem,
  14. fetchStoreItems,
  15. saveStoreItems,
  16. recoverStoreItems
  17. } from '@/utils'
  18. import type { Model as SModel } from '@/api'
  19. export type Model = SModel & { loaded: boolean, error: boolean, progress: number }
  20. export type Models = Model[]
  21. export const models = ref<Models>([])
  22. export const getModel = (modelId: Model['id']) => models.value.find(model => model.id === modelId)
  23. export const getModelShowVariable = (model: Model) =>
  24. computed({
  25. get: () => custom.modelsChangeStore
  26. ? model.show
  27. : custom.showModelsMap.get(model) || false,
  28. set: (show: boolean) => {
  29. if (custom.modelsChangeStore) {
  30. model.show = show
  31. } else {
  32. custom.showModelsMap.set(model, show)
  33. }
  34. }
  35. })
  36. export const modelsLoaded = ref(false)
  37. watchPostEffect(() => {
  38. const loaded = models.value.every(model => model.loaded || model.error)
  39. modelsLoaded.value = loaded
  40. })
  41. let bcModels: Models = []
  42. export const getBackupModels = () => bcModels
  43. export const backupModels = () => {
  44. bcModels = models.value.map(model => ({
  45. ...model,
  46. rotation: {...model.rotation},
  47. position: {...model.position},
  48. }))
  49. }
  50. const serviceToLocal = (model: SModel): Model => ({
  51. ...model,
  52. error: false,
  53. loaded: false,
  54. progress: 0,
  55. })
  56. export const recoverModels = recoverStoreItems(models, getBackupModels)
  57. export const addModel = async (file: File) => {
  58. const model = await postAddModel(file)
  59. models.value.push(serviceToLocal(model))
  60. }
  61. export const updateModel = updateStoreItem(models, postUpdateModels)
  62. export const deleteModel = deleteStoreItem(models, model => postDeleteModel(model.id))
  63. export const initialModels = fetchStoreItems(
  64. models,
  65. fetchModels,
  66. () => {
  67. const showModelsMap = new Map<Model, boolean>()
  68. for (const model of models.value) {
  69. showModelsMap.set(model, model.show)
  70. }
  71. showModelsMapStack.push(ref(showModelsMap))
  72. backupModels()
  73. },
  74. smodels => smodels.map(serviceToLocal),
  75. )
  76. export const saveModels = saveStoreItems(
  77. models,
  78. getBackupModels,
  79. {
  80. update: updateModel,
  81. delete: deleteModel,
  82. }
  83. )
  84. export const autoSaveModels = autoSetModeCallback(models, {
  85. backup: backupModels,
  86. recovery: recoverModels,
  87. save: saveModels,
  88. isUpdate: () => modelsLoaded.value,
  89. })
  90. export { ModelType, ModelTypeDesc } from '@/api'
  91. export type { ModelAttrs } from '@/api'