useSync.hook.ts 4.2 KB

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