model.ts 3.0 KB

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