index.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import App from './app.vue'
  2. import { appEl, SceneTypeDesc, scenes } from '@/store'
  3. import { mount, deepIsRevise } from '@/utils'
  4. import { reactive, ref } from 'vue'
  5. import type { Scene } from '@/store'
  6. import type { ModelExpose } from './platform'
  7. export type FuseModelType = typeof fuseModel
  8. export type SceneModelType = Pick<Scene, 'type' | 'num'>
  9. export type ModelType = FuseModelType | SceneModelType
  10. export type ModelProps = { type: ModelType, callback: ((expose?: ModelExpose, err?: Error) => void) | null }
  11. export type { ModelExpose }
  12. export const fuseModel = Symbol('fuse')
  13. export const currentModel = ref<ModelType>(fuseModel)
  14. export const modelProps: ModelProps = reactive({ type: currentModel, callback: null })
  15. export const getModelTypeDesc = (model: ModelType) => {
  16. if (model === fuseModel) {
  17. return '融合场景'
  18. } else {
  19. return SceneTypeDesc[model.type]
  20. }
  21. }
  22. export const getModelDesc = (model: ModelType) => {
  23. console.log(model)
  24. if (model === fuseModel) {
  25. return '融合场景'
  26. } else {
  27. return scenes.value.find(scene => scene.num === model.num && scene.type === model.type)?.name
  28. }
  29. }
  30. const _loadModel = (() => {
  31. let oldModelType: ModelType
  32. let oldResult: Promise<ModelExpose>
  33. return (modelType: ModelType) => {
  34. if (!deepIsRevise(oldModelType, modelType)) {
  35. return oldResult
  36. }
  37. oldModelType = modelType
  38. return oldResult = new Promise<any>((resolve, reject) => {
  39. modelProps.callback = (data: any, err) => {
  40. if (err) {
  41. reject(err)
  42. } else {
  43. resolve(data)
  44. }
  45. }
  46. currentModel.value = modelType
  47. })
  48. }
  49. })();
  50. let isInitial = false
  51. export const loadModel = async (modelType: ModelType): Promise<ModelExpose> => {
  52. // 给 vue 加载时间,防止一进入就直接加载模型导致 vue 尚未初始化
  53. if (!isInitial) {
  54. await new Promise((resolve) => setTimeout(resolve, 10));
  55. }
  56. const modelPromise = _loadModel(modelType)
  57. if (!isInitial) {
  58. if (!appEl.value) {
  59. throw new Error('appEl 未初始化')
  60. } else {
  61. mount(appEl.value, App)
  62. isInitial = true
  63. }
  64. }
  65. return modelPromise
  66. }