62 lines
1.9 KiB
TypeScript
62 lines
1.9 KiB
TypeScript
/* eslint-disable react/jsx-curly-newline */
|
||
/* eslint-disable no-negated-condition */
|
||
import { FormContext } from '../context/form-context';
|
||
import * as apiIus from '@/api/ius/query';
|
||
import type { HttpError } from '@/api/ius/types';
|
||
import { useFormStore } from '@/store/ius/form';
|
||
import { Button } from '@repo/ui';
|
||
import { pick } from 'radash';
|
||
import { useCallback, useContext } from 'react';
|
||
|
||
const ERROR_UPLOAD_DOCUMENT = 'Произошла ошибка при загрузке документов';
|
||
|
||
export function Buttons() {
|
||
const { resetValidation } = useFormStore();
|
||
const { formFiles, pageUrlParams, setFormFiles, setFormState } = useContext(FormContext);
|
||
|
||
const handleUploadFiles = useCallback(() => {
|
||
setFormState({ status: 'pending' });
|
||
resetValidation();
|
||
const uploadFiles = formFiles.map((formFile) => {
|
||
const formData = new FormData();
|
||
formData.append('file', formFile.file);
|
||
const document = pick(formFile, ['documentTypeId']);
|
||
|
||
return apiIus.uploadDocument({
|
||
document,
|
||
formData,
|
||
pageUrlParams,
|
||
});
|
||
});
|
||
|
||
return Promise.all(uploadFiles)
|
||
.then(() => {
|
||
setFormState({ status: 'success' });
|
||
setTimeout(() => {
|
||
window.location.reload();
|
||
}, 500);
|
||
})
|
||
.catch((error) => {
|
||
const _error = error as HttpError;
|
||
const text = _error?.errors?.at(0) || _error.title || ERROR_UPLOAD_DOCUMENT;
|
||
|
||
setFormState({ status: 'error', text });
|
||
});
|
||
}, [formFiles, pageUrlParams, resetValidation, setFormState]);
|
||
|
||
const handleCancel = () => {
|
||
setFormFiles([]);
|
||
};
|
||
|
||
return (
|
||
<div className="grid grid-cols-1 gap-2 gap-x-4 md:grid-cols-3">
|
||
<Button intent="outline-danger" onClick={handleCancel} disabled={!formFiles.length}>
|
||
Отмена
|
||
</Button>
|
||
<Button onClick={handleUploadFiles} disabled={!formFiles.length}>
|
||
Загрузить файлы
|
||
</Button>
|
||
</div>
|
||
);
|
||
}
|