|
|
|
@@ -10,6 +10,8 @@ import { ToastContext } from '@/app/components/base/toast' |
|
|
|
|
|
|
|
import { upload } from '@/service/base' |
|
|
|
import { fetchFileUploadConfig } from '@/service/common' |
|
|
|
import { fetchSupportFileTypes } from '@/service/datasets' |
|
|
|
import I18n from '@/context/i18n' |
|
|
|
|
|
|
|
type IFileUploaderProps = { |
|
|
|
fileList: FileItem[] |
|
|
|
@@ -20,18 +22,6 @@ type IFileUploaderProps = { |
|
|
|
onPreview: (file: File) => void |
|
|
|
} |
|
|
|
|
|
|
|
const ACCEPTS = [ |
|
|
|
'.pdf', |
|
|
|
'.html', |
|
|
|
'.htm', |
|
|
|
'.md', |
|
|
|
'.markdown', |
|
|
|
'.txt', |
|
|
|
'.xlsx', |
|
|
|
'.csv', |
|
|
|
'.docx', |
|
|
|
] |
|
|
|
|
|
|
|
const FileUploader = ({ |
|
|
|
fileList, |
|
|
|
titleClassName, |
|
|
|
@@ -42,12 +32,16 @@ const FileUploader = ({ |
|
|
|
}: IFileUploaderProps) => { |
|
|
|
const { t } = useTranslation() |
|
|
|
const { notify } = useContext(ToastContext) |
|
|
|
const { locale } = useContext(I18n) |
|
|
|
const [dragging, setDragging] = useState(false) |
|
|
|
const dropRef = useRef<HTMLDivElement>(null) |
|
|
|
const dragRef = useRef<HTMLDivElement>(null) |
|
|
|
const fileUploader = useRef<HTMLInputElement>(null) |
|
|
|
|
|
|
|
const { data: fileUploadConfigResponse } = useSWR({ url: '/files/upload' }, fetchFileUploadConfig) |
|
|
|
const { data: supportFileTypesResponse } = useSWR({ url: '/files/support-type' }, fetchSupportFileTypes) |
|
|
|
const supportTypes = supportFileTypesResponse?.allowed_extensions || [] |
|
|
|
const ACCEPTS = supportTypes.map((ext: string) => `.${ext}`) |
|
|
|
const fileUploadConfig = useMemo(() => fileUploadConfigResponse ?? { |
|
|
|
file_size_limit: 15, |
|
|
|
batch_count_limit: 5, |
|
|
|
@@ -228,14 +222,17 @@ const FileUploader = ({ |
|
|
|
<div className={cn(s.title, titleClassName)}>{t('datasetCreation.stepOne.uploader.title')}</div> |
|
|
|
<div ref={dropRef} className={cn(s.uploader, dragging && s.dragging)}> |
|
|
|
<div className='flex justify-center items-center min-h-6 mb-2'> |
|
|
|
<span className={s.uploadIcon}/> |
|
|
|
<span className={s.uploadIcon} /> |
|
|
|
<span> |
|
|
|
{t('datasetCreation.stepOne.uploader.button')} |
|
|
|
<label className={s.browse} onClick={selectHandle}>{t('datasetCreation.stepOne.uploader.browse')}</label> |
|
|
|
</span> |
|
|
|
</div> |
|
|
|
<div className={s.tip}>{t('datasetCreation.stepOne.uploader.tip', { size: fileUploadConfig.file_size_limit })}</div> |
|
|
|
{dragging && <div ref={dragRef} className={s.draggingCover}/>} |
|
|
|
<div className={s.tip}>{t('datasetCreation.stepOne.uploader.tip', { |
|
|
|
size: fileUploadConfig.file_size_limit, |
|
|
|
supportTypes: supportTypes.map(item => item.toUpperCase()).join(locale === 'en' ? ', ' : '、 '), |
|
|
|
})}</div> |
|
|
|
{dragging && <div ref={dragRef} className={s.draggingCover} />} |
|
|
|
</div> |
|
|
|
<div className={s.fileList}> |
|
|
|
{fileList.map((fileItem, index) => ( |
|
|
|
@@ -248,10 +245,10 @@ const FileUploader = ({ |
|
|
|
)} |
|
|
|
> |
|
|
|
{fileItem.progress < 100 && ( |
|
|
|
<div className={s.progressbar} style={{ width: `${fileItem.progress}%` }}/> |
|
|
|
<div className={s.progressbar} style={{ width: `${fileItem.progress}%` }} /> |
|
|
|
)} |
|
|
|
<div className={s.fileInfo}> |
|
|
|
<div className={cn(s.fileIcon, s[getFileType(fileItem.file)])}/> |
|
|
|
<div className={cn(s.fileIcon, s[getFileType(fileItem.file)])} /> |
|
|
|
<div className={s.filename}>{fileItem.file.name}</div> |
|
|
|
<div className={s.size}>{getFileSize(fileItem.file.size)}</div> |
|
|
|
</div> |
|
|
|
@@ -263,7 +260,7 @@ const FileUploader = ({ |
|
|
|
<div className={s.remove} onClick={(e) => { |
|
|
|
e.stopPropagation() |
|
|
|
removeFile(fileItem.fileID) |
|
|
|
}}/> |
|
|
|
}} /> |
|
|
|
)} |
|
|
|
</div> |
|
|
|
</div> |