Spaces:
Paused
Paused
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; | |