config.ts 5.72 KB
import {
  AzureIotHubFieldsEnum,
  AzureIotHubFieldsNameEnum,
} from '../../../../enum/formField/external';
import { FormSchema } from '/@/components/Form';
import { useI18n } from '/@/hooks/web/useI18n';

const { t } = useI18n();

export enum CredentialsTypeEnum {
  PEM = 'cert.PEM',
  SHARED_ACCESS_SIGNATURE = 'sas',
}

export enum CredentialsTypeNameEnum {
  PEM = 'PEM',
  SHARED_ACCESS_SIGNATURE = 'Shared Access Signature',
}

export interface FileItemType {
  uid: string;
  name: string;
  data?: any;
}

export const getFileData = async (file: FileItemType) => {
  return new Promise((resolve) => {
    const fileReader = new FileReader();
    fileReader.readAsText(file as unknown as File);
    fileReader.onload = () => {
      if (fileReader.DONE === fileReader.readyState) {
        resolve({
          uid: file.uid,
          name: file.name,
          data: fileReader.result,
        });
      }
    };
  });
};

export const credentialsTypeOptions = [
  {
    label: CredentialsTypeNameEnum.SHARED_ACCESS_SIGNATURE,
    value: CredentialsTypeEnum.SHARED_ACCESS_SIGNATURE,
  },
  { label: CredentialsTypeNameEnum.PEM, value: CredentialsTypeEnum.PEM },
];

export const formSchemas = (
  setType: (
    value: CredentialsTypeEnum,
    option: { label: CredentialsTypeNameEnum; value: CredentialsTypeEnum }
  ) => void
): FormSchema[] => {
  return [
    {
      field: AzureIotHubFieldsEnum.TYPE,
      label: t(AzureIotHubFieldsNameEnum.TYPE),
      component: 'Select',
      required: true,
      defaultValue: CredentialsTypeEnum.SHARED_ACCESS_SIGNATURE,
      componentProps: ({ formActionType }) => {
        const { setFieldsValue } = formActionType;
        return {
          options: credentialsTypeOptions,
          placeholder: `请选择${t(AzureIotHubFieldsNameEnum.TYPE)}`,
          getPopupContainer: () => document.body,
          allowClear: false,
          onChange(
            value: CredentialsTypeEnum,
            option: { label: CredentialsTypeNameEnum; value: CredentialsTypeEnum }
          ) {
            setType(value, option);
            setFieldsValue({
              [AzureIotHubFieldsEnum.CA_CERT]: [],
              [AzureIotHubFieldsEnum.CA_CERT_FILE_NAME]: null,
              [AzureIotHubFieldsEnum.CERT]: [],
              [AzureIotHubFieldsEnum.CERT_FILE_NAME]: null,
              [AzureIotHubFieldsEnum.PRIVATE_KEY]: [],
              [AzureIotHubFieldsEnum.PRIVATE_KEY_FILE_NAME]: null,
              [AzureIotHubFieldsEnum.PASSWORD]: null,
              [AzureIotHubFieldsEnum.SAS_KEY]: null,
            });
          },
        };
      },
    },
    {
      field: AzureIotHubFieldsEnum.SAS_KEY,
      label: t(AzureIotHubFieldsNameEnum.SAS_KEY),
      required: true,
      component: 'Input',
      ifShow: ({ model }) =>
        model[AzureIotHubFieldsEnum.TYPE] === CredentialsTypeEnum.SHARED_ACCESS_SIGNATURE,
      componentProps: {
        placeholder: `请输入${t(AzureIotHubFieldsNameEnum.SAS_KEY)}`,
      },
    },
    {
      field: AzureIotHubFieldsEnum.CA_CERT_FILE_NAME,
      label: t(AzureIotHubFieldsNameEnum.CA_CERT_FILE_NAME),
      component: 'InputPassword',
      show: false,
    },
    {
      field: AzureIotHubFieldsEnum.CA_CERT,
      label: t(AzureIotHubFieldsNameEnum.CA_CERT),
      component: 'ApiUpload',
      valueField: 'fileList',
      changeEvent: 'update:fileList',
      componentProps: ({ formActionType }) => {
        const { setFieldsValue } = formActionType;
        return {
          overFileLimitHiddenUploadEntry: true,
          api: getFileData,
          'onUpdate:fileList'(file: FileItemType[]) {
            setFieldsValue({ [AzureIotHubFieldsEnum.CA_CERT_FILE_NAME]: file?.[0]?.name });
          },
        };
      },
    },
    {
      field: AzureIotHubFieldsEnum.CERT_FILE_NAME,
      label: t(AzureIotHubFieldsNameEnum.CERT_FILE_NAME),
      component: 'InputPassword',
      show: false,
    },
    {
      field: AzureIotHubFieldsEnum.CERT,
      label: t(AzureIotHubFieldsNameEnum.CERT),
      component: 'ApiUpload',
      valueField: 'fileList',
      changeEvent: 'update:fileList',
      required: true,
      ifShow: ({ model }) => model[AzureIotHubFieldsEnum.TYPE] === CredentialsTypeEnum.PEM,
      componentProps: ({ formActionType }) => {
        const { setFieldsValue } = formActionType;
        return {
          overFileLimitHiddenUploadEntry: true,
          api: getFileData,
          'onUpdate:fileList'(file: FileItemType[]) {
            setFieldsValue({ [AzureIotHubFieldsEnum.CERT_FILE_NAME]: file?.[0]?.name });
          },
        };
      },
    },
    {
      field: AzureIotHubFieldsEnum.PRIVATE_KEY_FILE_NAME,
      label: t(AzureIotHubFieldsNameEnum.PRIVATE_KEY_FILE_NAME),
      component: 'InputPassword',
      show: false,
    },
    {
      field: AzureIotHubFieldsEnum.PRIVATE_KEY,
      label: t(AzureIotHubFieldsNameEnum.PRIVATE_KEY),
      component: 'ApiUpload',
      valueField: 'fileList',
      changeEvent: 'update:fileList',
      required: true,
      ifShow: ({ model }) => model[AzureIotHubFieldsEnum.TYPE] === CredentialsTypeEnum.PEM,
      componentProps: ({ formActionType }) => {
        const { setFieldsValue } = formActionType;
        return {
          overFileLimitHiddenUploadEntry: true,
          api: getFileData,
          'onUpdate:fileList'(file: FileItemType[]) {
            setFieldsValue({ [AzureIotHubFieldsEnum.PRIVATE_KEY_FILE_NAME]: file?.[0]?.name });
          },
        };
      },
    },
    {
      field: AzureIotHubFieldsEnum.PASSWORD,
      label: t(AzureIotHubFieldsNameEnum.PASSWORD),
      component: 'InputPassword',
      ifShow: ({ model }) => model[AzureIotHubFieldsEnum.TYPE] === CredentialsTypeEnum.PEM,
      componentProps: {
        placeholder: `请输入${t(AzureIotHubFieldsNameEnum.PASSWORD)}`,
      },
    },
  ];
};