asb_cloud_front/src/components/UploadForm.jsx
goodm2ice 183017a72d * Пробельные символы разрешены в серение логина
* Установлены 2 знака после запятой для страниц композитной скважины и куста
* Удалена старая версия tvd
* Расставлено memo
* Стилистические исправления
* Улучшены типы
* Добавлены экспорты по умолчанию
* SelectFromDictionary удалён за ненадобностью
* DatePickerWrapper получил свойство isUTC меняющее обработку даты
* Относительные пути заменены на алиасы
2022-01-24 21:16:50 +05:00

59 lines
1.7 KiB
JavaScript

import { memo, useState } from 'react'
import { Upload, Button } from 'antd'
import { UploadOutlined } from '@ant-design/icons'
import { upload } from './factory'
import { ErrorFetch } from './ErrorFetch'
export const UploadForm = memo(({ url, accept, style, formData, onUploadStart, onUploadSuccess, onUploadComplete, onUploadError }) => {
const [fileList, setfileList] = useState([])
const handleFileSend = async () => {
onUploadStart?.()
try {
const formDataLocal = new FormData()
fileList.forEach((val) => formDataLocal.append('files', val.originFileObj))
if(formData)
for(const propName in formData)
formDataLocal.append(propName, formData[propName])
const response = await upload(url, formDataLocal)
if (!response.ok) {
const errorText = await response.text()
const error = new ErrorFetch(response.status, errorText)
throw error
} else {
onUploadSuccess?.()
}
} catch(error) {
onUploadError?.(error)
} finally {
setfileList([])
onUploadComplete?.()
}
}
const isSendButtonEnabled = fileList.length > 0
return(
<div style={{ display: 'flex', ...style }}>
<Upload
name={'file'}
accept={accept}
fileList={fileList}
onChange={(props) => setfileList(props.fileList)}
>
<Button icon={<UploadOutlined/>}>Загрузить файл</Button>
</Upload>
<Button
type={'primary'}
onClick={handleFileSend}
disabled={!isSendButtonEnabled}
style={{ marginLeft: '10px', display: isSendButtonEnabled ? '' : 'none' }}
>
Отправить
</Button>
</div>
)
})