blob: bf0b3dad28ec427888827b5fdbd563717d557203 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { UploadOutlined } from '@ant-design/icons';
import { Button, Form, Upload } from 'antd';
import type { UploadFile } from 'antd/lib/upload/interface';
import React from 'react';
import { useIntl } from 'umi';
import styles from '@/pages/SSL/style.less';
export type UploadType = 'PUBLIC_KEY' | 'PRIVATE_KEY';
type UploaderProps = {
data: {
publicKeyList: UploadFile[];
privateKeyList: UploadFile[];
};
onSuccess: (
data: Partial<SSLModule.UploadPrivateSuccessData & SSLModule.UploadPublicSuccessData>,
) => void;
onRemove: (type: UploadType) => void;
};
const CertificateUploader: React.FC<UploaderProps> = ({ onSuccess, onRemove, data }) => {
const { publicKeyList = [], privateKeyList = [] } = data;
const [form] = Form.useForm();
const { formatMessage } = useIntl();
const genUploadFile = (name = ''): UploadFile => {
return {
uid: Math.random().toString(36).slice(2),
name,
status: 'done',
size: 0,
type: '',
};
};
const parseCertificate = (file: File | Blob, fileName: string, type: UploadType) => {
const fileReader = new FileReader();
fileReader.readAsText(file);
// eslint-disable-next-line func-names
fileReader.onload = function (event) {
const { result } = event.currentTarget as any;
if (type === 'PUBLIC_KEY') {
const uploadPublicData: SSLModule.UploadPublicSuccessData = {
cert: result,
publicKeyList: [genUploadFile(fileName)],
};
onSuccess(uploadPublicData);
} else {
const uploadprivateData: SSLModule.UploadPrivateSuccessData = {
key: result,
privateKeyList: [genUploadFile(fileName)],
};
onSuccess(uploadprivateData);
}
};
};
const beforeUpload = (file: File, fileList: File[], type: UploadType) => {
parseCertificate(file, file.name, type);
return false;
};
return (
<Form form={form} layout="horizontal" className={styles.stepForm}>
<Form.Item>
<Upload
className={styles.stepForm}
onRemove={() => onRemove('PUBLIC_KEY')}
fileList={publicKeyList}
beforeUpload={(file, fileList) => beforeUpload(file, fileList, 'PUBLIC_KEY')}
>
<Button disabled={publicKeyList.length === 1}>
<UploadOutlined /> {formatMessage({ id: 'page.ssl.button.uploadCert' })}
</Button>
</Upload>
</Form.Item>
<Form.Item>
<Upload
className={styles.stepForm}
onRemove={() => onRemove('PRIVATE_KEY')}
fileList={privateKeyList}
beforeUpload={(file, fileList) => beforeUpload(file, fileList, 'PRIVATE_KEY')}
>
<Button disabled={privateKeyList.length === 1}>
<UploadOutlined />{' '}
{`${formatMessage({ id: 'page.ssl.upload' })}${formatMessage({
id: 'page.ssl.form.itemLabel.privateKey',
})}`}
</Button>
</Upload>
</Form.Item>
</Form>
);
};
export default CertificateUploader;