useNodeEvent.ts 3.36 KB
import { h, render } from 'vue'
import { doCommandDelivery, getDeviceActive } from '@/api/device'
import type { MouseUpEventDataType, NodeDataDataSourceJsonType, NodeDataEventJsonType, SingleClickEventDataType } from '@/api/node/model'
import { CommandWayEnum } from '@/enums/commandEnum'
import { EventActionTypeEnum } from '@/enums/datasource'
import { useMessage } from '@/hooks/web/useMessage'
import { CommandDeliveryModal } from '@/core/Library/components/PublicForm/components/DataEvents/CommandDeliveryModal'

export function useNodeEvent(eventJson: NodeDataEventJsonType, dataSourceJson: NodeDataDataSourceJsonType) {
  const { createMessage } = useMessage()

  const handlerCommandDelivery = async (data: MouseUpEventDataType) => {
    try {
      const promiseList: (() => Promise<any>)[] = []
      const { commandList = [], enable } = data || {}
      if (!enable) return
      for (const item of commandList) {
        const { command, way, deviceId } = item
        promiseList.push(async () => {
          if (way === CommandWayEnum.TWO_WAY) {
            const [record] = await getDeviceActive(deviceId)
            if (!record.value) {
              createMessage.warning('设备不在线')
              return
            }
          }
          await doCommandDelivery({
            way,
            deviceId,
            command: {
              additionalInfo: { cmdType: 'API' },
              method: 'methodThingskit',
              params: command,
              persistent: true,
            },
          })
          createMessage.success('下发成功~')
        })
      }

      await Promise.all(promiseList.map(fn => fn()))
    }
    catch (error) {
      createMessage.error(error as string)
    }
  }

  const handleOpenLink = (data: SingleClickEventDataType) => {
    const { openLink } = data
    window.open(openLink)
  }

  const handleSwitchPage = (data: SingleClickEventDataType) => {
    const { openPage } = data
    const pages = window.DrawApp.pages
    const openPageFile = pages.find(item => item.getId() === openPage)
    if (openPageFile)
      window.DrawApp.selectPage(openPageFile)
  }

  const handleParamsSetting = async (_data: SingleClickEventDataType) => {
    const deviceInfo = dataSourceJson

    const instance = h(CommandDeliveryModal)
    render(instance, document.body);
    (instance.component?.exposed as InstanceType<typeof CommandDeliveryModal>)?.open({ ..._data, deviceInfo, operationPassword: eventJson?.OPERATION_PASSWORD })
  }

  const handlerMouseClickEvent = (data: SingleClickEventDataType) => {
    const { actionType, enable } = data
    if (!enable) return
    if (actionType === EventActionTypeEnum.OPEN_LINK)
      handleOpenLink(data)
    else if (actionType === EventActionTypeEnum.OPEN_PAGE)
      handleSwitchPage(data)
    else if (actionType === EventActionTypeEnum.PARAMS_SETTING)
      handleParamsSetting(data)
  }

  const handlerMouseDown = async () => {
    eventJson.DOWN && handlerCommandDelivery(eventJson.DOWN)
  }

  const handlerMouseUp = () => {
    eventJson.UP && handlerCommandDelivery(eventJson.UP)
  }

  const handlerMouseClick = () => {
    eventJson.SINGLE && handlerMouseClickEvent(eventJson.SINGLE)
  }

  const handlerMouseDoubleClick = () => {
    eventJson.DOUBLE && handlerMouseClickEvent(eventJson.DOUBLE)
  }

  return {
    handlerMouseUp,
    handlerMouseDown,
    handlerMouseClick,
    handlerMouseDoubleClick,
  }
}