|
import { useTranslate } from '@/hooks/common-hooks'; |
|
import { IModalProps } from '@/interfaces/common'; |
|
import { InboxOutlined } from '@ant-design/icons'; |
|
import { |
|
Flex, |
|
Modal, |
|
Segmented, |
|
Tabs, |
|
TabsProps, |
|
Upload, |
|
UploadFile, |
|
UploadProps, |
|
} from 'antd'; |
|
import { Dispatch, SetStateAction, useState } from 'react'; |
|
|
|
import styles from './index.less'; |
|
|
|
const { Dragger } = Upload; |
|
|
|
const FileUpload = ({ |
|
directory, |
|
fileList, |
|
setFileList, |
|
}: { |
|
directory: boolean; |
|
fileList: UploadFile[]; |
|
setFileList: Dispatch<SetStateAction<UploadFile[]>>; |
|
}) => { |
|
const { t } = useTranslate('fileManager'); |
|
const props: UploadProps = { |
|
multiple: true, |
|
onRemove: (file) => { |
|
const index = fileList.indexOf(file); |
|
const newFileList = fileList.slice(); |
|
newFileList.splice(index, 1); |
|
setFileList(newFileList); |
|
}, |
|
beforeUpload: (file) => { |
|
setFileList((pre) => { |
|
return [...pre, file]; |
|
}); |
|
|
|
return false; |
|
}, |
|
directory, |
|
fileList, |
|
}; |
|
|
|
return ( |
|
<Dragger {...props} className={styles.uploader}> |
|
<p className="ant-upload-drag-icon"> |
|
<InboxOutlined /> |
|
</p> |
|
<p className="ant-upload-text">{t('uploadTitle')}</p> |
|
<p className="ant-upload-hint">{t('uploadDescription')}</p> |
|
{false && <p className={styles.uploadLimit}>{t('uploadLimit')}</p>} |
|
</Dragger> |
|
); |
|
}; |
|
|
|
const FileUploadModal = ({ |
|
visible, |
|
hideModal, |
|
loading, |
|
onOk: onFileUploadOk, |
|
}: IModalProps<UploadFile[]>) => { |
|
const { t } = useTranslate('fileManager'); |
|
const [value, setValue] = useState<string | number>('local'); |
|
const [fileList, setFileList] = useState<UploadFile[]>([]); |
|
const [directoryFileList, setDirectoryFileList] = useState<UploadFile[]>([]); |
|
|
|
const clearFileList = () => { |
|
setFileList([]); |
|
setDirectoryFileList([]); |
|
}; |
|
|
|
const onOk = async () => { |
|
const ret = await onFileUploadOk?.([...fileList, ...directoryFileList]); |
|
return ret; |
|
}; |
|
|
|
const afterClose = () => { |
|
clearFileList(); |
|
}; |
|
|
|
const items: TabsProps['items'] = [ |
|
{ |
|
key: '1', |
|
label: t('file'), |
|
children: ( |
|
<FileUpload |
|
directory={false} |
|
fileList={fileList} |
|
setFileList={setFileList} |
|
></FileUpload> |
|
), |
|
}, |
|
{ |
|
key: '2', |
|
label: t('directory'), |
|
children: ( |
|
<FileUpload |
|
directory |
|
fileList={directoryFileList} |
|
setFileList={setDirectoryFileList} |
|
></FileUpload> |
|
), |
|
}, |
|
]; |
|
|
|
return ( |
|
<> |
|
<Modal |
|
title={t('uploadFile')} |
|
open={visible} |
|
onOk={onOk} |
|
onCancel={hideModal} |
|
confirmLoading={loading} |
|
afterClose={afterClose} |
|
> |
|
<Flex gap={'large'} vertical> |
|
<Segmented |
|
options={[ |
|
{ label: t('local'), value: 'local' }, |
|
{ label: t('s3'), value: 's3' }, |
|
]} |
|
block |
|
value={value} |
|
onChange={setValue} |
|
/> |
|
{value === 'local' ? ( |
|
<Tabs defaultActiveKey="1" items={items} /> |
|
) : ( |
|
t('comingSoon', { keyPrefix: 'common' }) |
|
)} |
|
</Flex> |
|
</Modal> |
|
</> |
|
); |
|
}; |
|
|
|
export default FileUploadModal; |
|
|