useSync.hook.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import { getUUID } from '@/utils'
  2. import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
  3. import { ChartEditStoreEnum, ChartEditStorage } from '@/store/modules/chartEditStore/chartEditStore.d'
  4. import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore'
  5. import { fetchChartComponent, fetchConfigComponent, createComponent } from '@/packages/index'
  6. import { CreateComponentType, CreateComponentGroupType, ConfigType } from '@/packages/index.d'
  7. import { PublicGroupConfigClass } from '@/packages/public/publicConfig'
  8. // 请求处理
  9. export const useSync = () => {
  10. const chartEditStore = useChartEditStore()
  11. const chartHistoryStore = useChartHistoryStore()
  12. /**
  13. * * 组件动态注册
  14. * @param projectData 项目数据
  15. * @param isReplace 是否替换数据
  16. * @returns
  17. */
  18. const updateComponent = async (projectData: ChartEditStorage, isReplace = false, changeId = false) => {
  19. if (isReplace) {
  20. // 清除列表
  21. chartEditStore.componentList = []
  22. // 清除历史记录
  23. chartHistoryStore.clearBackStack()
  24. chartHistoryStore.clearForwardStack()
  25. }
  26. // 列表组件注册
  27. projectData.componentList.forEach(async (e: CreateComponentType | CreateComponentGroupType) => {
  28. const intComponent = (target: CreateComponentType) => {
  29. if (!window['$vue'].component(target.chartConfig.chartKey)) {
  30. window['$vue'].component(target.chartConfig.chartKey, fetchChartComponent(target.chartConfig))
  31. window['$vue'].component(target.chartConfig.conKey, fetchConfigComponent(target.chartConfig))
  32. }
  33. }
  34. if (e.isGroup) {
  35. (e as CreateComponentGroupType).groupList.forEach(groupItem => {
  36. intComponent(groupItem)
  37. })
  38. } else {
  39. intComponent(e as CreateComponentType)
  40. }
  41. })
  42. // 数据赋值
  43. for (const key in projectData) {
  44. // 组件
  45. if (key === ChartEditStoreEnum.COMPONENT_LIST) {
  46. for (const comItem of projectData[key]) {
  47. // 重新创建是为了处理类种方法消失的问题
  48. const create = async (
  49. _componentInstance: CreateComponentType,
  50. callBack?: (componentInstance: CreateComponentType) => void
  51. ) => {
  52. // 补充 class 上的方法
  53. let newComponent: CreateComponentType = await createComponent(_componentInstance.chartConfig)
  54. if (callBack) {
  55. if (changeId) {
  56. callBack(Object.assign(newComponent, { ..._componentInstance, id: getUUID() }))
  57. } else {
  58. callBack(Object.assign(newComponent, _componentInstance))
  59. }
  60. } else {
  61. if (changeId) {
  62. chartEditStore.addComponentList(
  63. Object.assign(newComponent, { ..._componentInstance, id: getUUID() }),
  64. false,
  65. true
  66. )
  67. } else {
  68. chartEditStore.addComponentList(Object.assign(newComponent, _componentInstance), false, true)
  69. }
  70. }
  71. }
  72. if (comItem.isGroup) {
  73. // 创建分组
  74. let groupClass = new PublicGroupConfigClass()
  75. if (changeId) {
  76. groupClass = Object.assign(groupClass, { ...comItem, id: getUUID() })
  77. } else {
  78. groupClass = Object.assign(groupClass, comItem)
  79. }
  80. // 注册子应用
  81. const targetList: CreateComponentType[] = []
  82. ;(comItem as CreateComponentGroupType).groupList.forEach(groupItem => {
  83. create(groupItem, e => {
  84. targetList.push(e)
  85. })
  86. })
  87. groupClass.groupList = targetList
  88. // 分组插入到列表
  89. chartEditStore.addComponentList(groupClass, false, true)
  90. } else {
  91. create(comItem as CreateComponentType)
  92. }
  93. }
  94. } else {
  95. // 非组件(顺便排除脏数据)
  96. if (key !== 'editCanvasConfig' && key !== 'requestGlobalConfig') return
  97. Object.assign(chartEditStore[key], projectData[key])
  98. }
  99. }
  100. }
  101. return {
  102. updateComponent
  103. }
  104. }