useContentData.ts 2.74 KB
import { h, render } from 'vue'
import { useParseParams, usePlatform } from '..'
import { checkShareModeNeedPassword, doAppLogin, getConfigurationContent as getContent, getShareDataByAccessCredentials, getShareToken, saveConfigurationContent as saveData } from '@/api/content'
import type { ConfigurationContentType } from '@/api/content/model'
import { ShareLoginModal } from '@/core/Share'
import { PageModeEnum } from '@/enums/modeEnum'
import { useContentDataStoreWithOut } from '@/store/modules/contentData'
import { useUserStoreWithOut } from '@/store/modules/user'
import { useMessage } from '@/hooks/web/useMessage'
import { MessageEnum } from '@/enums/messageEnum'
import { useProduct } from '@/core/Library/hook/useProduct'

export function useContentData() {
  const contentDataStore = useContentDataStoreWithOut()
  const params = useParseParams()
  const { mode, publicId, configurationId, userId } = params
  const userStore = useUserStoreWithOut()
  const { createMessage } = useMessage()

  const shareModeBootstrap = async () => {
    if (!publicId) return
    await usePlatform()
    const { token, refreshToken } = await getShareToken(publicId)
    userStore.storeShareToken(token, refreshToken)
    const { data } = await checkShareModeNeedPassword(configurationId)

    let result: ConfigurationContentType
    if (data) {
      const instance = h(ShareLoginModal)
      render(instance, document.body)
      result = await (instance.component?.exposed as InstanceType<typeof ShareLoginModal>).open()
    }
    else {
      const { data } = await getShareDataByAccessCredentials(configurationId)
      result = data
    }

    return result
  }

  const doGetConfigurationContent = async () => {
    if (userId) {
      const { token, refreshToken } = await doAppLogin(userId)
      userStore.storeToken(token, refreshToken)
    }

    const result = mode === PageModeEnum.SHARE ? await shareModeBootstrap() : await getContent()

    if (result) {
      const { getAllDeviceProfileIds } = useProduct()
      await getAllDeviceProfileIds(result)

      const { productAndDevice, nodelist, isTemplate, templateId } = result
      if (nodelist) contentDataStore.saveContentData(nodelist)
      if (isTemplate) contentDataStore.setIsTemplate(isTemplate)
      contentDataStore.setIsTemplateLink(templateId)
      if (productAndDevice) contentDataStore.setProductAndDevice(productAndDevice)
    }
    return result
  }

  const doSaveConfigurationContent = async (params: ConfigurationContentType) => {
    if (!contentDataStore.hasDesignAuth) {
      createMessage.error(MessageEnum.NO_AUTH)
      return
    }
    return saveData(params)
  }

  return {
    configurationId,
    doGetConfigurationContent,
    doSaveConfigurationContent,
  }
}

window.useContentData = useContentData