useObjectFormData.ts 4.03 KB
import DataTypeForm from './DataTypeForm.vue';
import { FormFieldsEnum } from './config';
import { ObjectModelFormGetFieldsValueType } from './types';
import { DefineComponentsBasicExpose } from '/#/utils';
import { ModelOfMatterParams, StructJSON } from '/@/api/device/model/modelOfMatterModel';
import { FormActionType } from '/@/components/Form';
import { TransportTypeEnum } from '/@/enums/deviceEnum';
import { FunctionTypeEnum } from '/@/enums/objectModelEnum';
import { Ref, toRaw, unref } from 'vue';

interface UseObjectFormDataParamsType {
  formActionType: FormActionType;
  dataTypeFormRef: Ref<InstanceType<typeof DataTypeForm> | undefined>;
  transportType: TransportTypeEnum;
}

function handlePropertiesType(
  value: ObjectModelFormGetFieldsValueType,
  dataTypeFormValue: StructJSON,
  transportType?: TransportTypeEnum
): ModelOfMatterParams {
  const { functionType, accessMode, remark, extensionDesc } = value;
  const { functionName, identifier, dataType } = dataTypeFormValue;

  const result: ModelOfMatterParams = {
    functionType,
    functionName,
    identifier,
    functionJson: {
      dataType,
    },
    accessMode,
    remark,
  };

  if (transportType === TransportTypeEnum.TCP && extensionDesc)
    result.extensionDesc = extensionDesc;

  return result;
}

function handleServiceType(
  value: ObjectModelFormGetFieldsValueType,
  transportType: TransportTypeEnum
): ModelOfMatterParams {
  const {
    functionName,
    identifier,
    functionType,
    remark,
    inputData = [],
    outputData = [],
    serviceCommand,
  } = value;

  return {
    functionType,
    functionName,
    identifier,
    remark,
    functionJson: {
      inputData:
        transportType === TransportTypeEnum.TCP
          ? [{ [FormFieldsEnum.SERVICE_COMMAND]: serviceCommand } as unknown as StructJSON]
          : inputData,
      outputData,
    },
  };
}

function handleEventType(value: ObjectModelFormGetFieldsValueType): ModelOfMatterParams {
  const { functionName, identifier, functionType, remark, eventType, outputData = [] } = value;

  return {
    functionType,
    functionName,
    identifier,
    remark,
    eventType,
    functionJson: {
      outputData,
    },
  };
}

export const useObjectFormData = ({
  formActionType,
  dataTypeFormRef,
  transportType,
}: UseObjectFormDataParamsType): DefineComponentsBasicExpose<ModelOfMatterParams> => {
  const getFieldsValue = (): ModelOfMatterParams => {
    const value = formActionType.getFieldsValue() as ObjectModelFormGetFieldsValueType;
    const { functionType } = value;

    if (functionType === FunctionTypeEnum.PROPERTIES) {
      const dataTypeFormValue = unref(dataTypeFormRef)?.getFieldsValue?.();
      return handlePropertiesType(value, dataTypeFormValue!, transportType);
    }

    if (functionType === FunctionTypeEnum.EVENTS) {
      return handleEventType(value);
    } else {
      return handleServiceType(value, transportType);
    }
  };

  const setFieldsValue = (values: ModelOfMatterParams) => {
    values = toRaw(unref(values));
    const {
      functionName,
      identifier,
      functionJson,
      functionType,
      accessMode,
      callType,
      remark,
      extensionDesc,
    } = values;
    const { dataType, inputData = [], outputData = [] } = functionJson || {};

    formActionType.setFieldsValue({
      identifier,
      functionName,
      functionType,
      accessMode,
      callType,
      inputData,
      outputData,
      remark,
      serviceCommand: transportType === TransportTypeEnum.TCP ? inputData?.[0]?.serviceCommand : '',
      extensionDesc,
    } as ObjectModelFormGetFieldsValueType);

    if (functionType === FunctionTypeEnum.PROPERTIES) {
      unref(dataTypeFormRef)?.setFieldsValue({
        functionName,
        identifier,
        dataType,
      } as StructJSON);
    }
  };

  const validate = async () => {
    await formActionType.validate();
    await unref(dataTypeFormRef)?.validate?.();
  };

  const resetFieldsValue = () => {
    formActionType.resetFields();
  };

  return { getFieldsValue, setFieldsValue, validate, resetFieldsValue };
};