contentData.ts 2.63 KB
import { defineStore } from 'pinia'
import { toRaw, unref } from 'vue'
import { store } from '..'
import type { NodeDataType } from '@/api/node/model'
import type { ProductAndDevice } from '@/api/content/model'
import type { CreateComponentType } from '@/core/Library/types'

interface DeviceList {
  deviceId: string
  name: string
  codeType: string
}

interface ContentDataStoreType {
  contentData: NodeDataType[]
  configurationId: Nullable<string>
  productAndDevice: ProductAndDevice[]
  isTemplate?: number | null | string
  configurationContentList?: any
  configurationContentId: Nullable<string>
  diveceDetailMap: Record<string, DeviceList>
}

export const useContentDataStore = defineStore('app-content-data', {
  state: (): ContentDataStoreType => ({
    contentData: [],
    configurationId: null,
    isTemplate: null,
    productAndDevice: [],
    configurationContentList: [],
    configurationContentId: null,
    diveceDetailMap: {},
  }),
  actions: {

    getNodeDataById(id: string): Undefineable<NodeDataType> {
      const data = this.contentData.find(item => item.id === id)
      return data
    },

    setNodeDataById(id: string, nodeData: NodeDataType) {
      const index = this.contentData.findIndex(item => item.id === id)
      this.contentData.splice(index, 1, nodeData)
    },

    saveContentData(contentData: NodeDataType[]) {
      this.contentData = contentData
    },

    setConfigurationContentId(string: Nullable<string>) {
      this.configurationContentId = string
    },

    setIsTemplate(string?: string | number) {
      this.isTemplate = string
    },

    setProductAndDevice(list: ProductAndDevice[]) {
      this.productAndDevice = list
      this.doBuildDeviceMap()
      return list
    },

    doBuildDeviceMap() {
      const list = this.productAndDevice.map(item => toRaw(unref(item.deviceList))).flat(1)
      this.diveceDetailMap = list.reduce((prev, next) => {
        return { ...prev, [next?.deviceId]: next }
      }, {} as Record<'string', DeviceList>)
    },

    getCurrentNodeDataById(config: CreateComponentType): Nullable<NodeDataType> {
      const { cellInfo } = config
      const { id } = cellInfo || {}
      if (!id) return null
      return this.contentData.find(item => item.id === id) || null
    },
  },

  getters: {
    getProductIds(): string[] {
      return this.productAndDevice.map(item => item.profileId)
    },

    getProductAndDevice(): Nullable<ProductAndDevice[]> {
      return this.productAndDevice || []
    },
    getIsTemplate(): number | null | string | undefined {
      return this.isTemplate
    },
  },
})

export function useContentDataStoreWithOut() {
  return useContentDataStore(store)
}