diff --git a/apps/web/components/Form/Buttons.tsx b/apps/web/components/Form/Common/Buttons.tsx similarity index 68% rename from apps/web/components/Form/Buttons.tsx rename to apps/web/components/Form/Common/Buttons.tsx index fbd7c2b..2273d1f 100644 --- a/apps/web/components/Form/Buttons.tsx +++ b/apps/web/components/Form/Common/Buttons.tsx @@ -1,19 +1,16 @@ /* eslint-disable react/jsx-curly-newline */ /* eslint-disable no-negated-condition */ -import { FormContext } from './context/form-context'; +import { FormContext } from '../context/form-context'; import * as apiIus from '@/api/ius/query'; import { useFormStore } from '@/store/ius/form'; import { Button } from '@repo/ui'; import { useRouter } from 'next/navigation'; -import { pick } from 'radash'; import { useCallback } from 'react'; import { useContext } from 'react'; -const ERROR_UPLOAD_DOCUMENT = 'Произошла ошибка при загрузке документов'; - export function Buttons() { const { reset, resetValidation, setValidation, values } = useFormStore(); - const { formFiles, pageUrlParams, setFormState } = useContext(FormContext); + const { pageUrlParams, setFormState } = useContext(FormContext); const router = useRouter(); @@ -37,27 +34,6 @@ export function Buttons() { }); }, [pageUrlParams, router, setFormState, setValidation, values]); - 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.allSettled(uploadFiles).catch(() => { - setFormState({ status: 'error', text: ERROR_UPLOAD_DOCUMENT }); - throw new Error(ERROR_UPLOAD_DOCUMENT); - }); - }, [formFiles, pageUrlParams, resetValidation, setFormState]); - const handleRetract = useCallback(() => { setFormState({ status: 'pending' }); resetValidation(); @@ -93,7 +69,7 @@ export function Buttons() { - + ); } diff --git a/apps/web/components/Form/Elements.tsx b/apps/web/components/Form/Common/Elements.tsx similarity index 97% rename from apps/web/components/Form/Elements.tsx rename to apps/web/components/Form/Common/Elements.tsx index 8233132..94f79f0 100644 --- a/apps/web/components/Form/Elements.tsx +++ b/apps/web/components/Form/Common/Elements.tsx @@ -1,4 +1,4 @@ -import type { FormComponentProps } from './types'; +import type { FormComponentProps } from '../types'; import type { MetaObject } from '@/api/ius/types'; import { mapFieldTypeElement } from '@/config/elements'; import { useFormStore } from '@/store/ius/form'; diff --git a/apps/web/components/Form/Common/index.ts b/apps/web/components/Form/Common/index.ts new file mode 100644 index 0000000..7e1a3af --- /dev/null +++ b/apps/web/components/Form/Common/index.ts @@ -0,0 +1,2 @@ +export * from './Buttons'; +export * from './Elements'; diff --git a/apps/web/components/Form/Documents/Buttons.tsx b/apps/web/components/Form/Documents/Buttons.tsx new file mode 100644 index 0000000..2039bc3 --- /dev/null +++ b/apps/web/components/Form/Documents/Buttons.tsx @@ -0,0 +1,44 @@ +/* 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 { useFormStore } from '@/store/ius/form'; +import { Button } from '@repo/ui'; +import { pick } from 'radash'; +import { useCallback } from 'react'; +import { useContext } from 'react'; + +const ERROR_UPLOAD_DOCUMENT = 'Произошла ошибка при загрузке документов'; + +export function Buttons() { + const { resetValidation } = useFormStore(); + const { formFiles, pageUrlParams, 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.allSettled(uploadFiles).catch(() => { + setFormState({ status: 'error', text: ERROR_UPLOAD_DOCUMENT }); + throw new Error(ERROR_UPLOAD_DOCUMENT); + }); + }, [formFiles, pageUrlParams, resetValidation, setFormState]); + + return ( +
+
+ +
+ ); +} diff --git a/apps/web/components/Form/Files.tsx b/apps/web/components/Form/Documents/Files.tsx similarity index 94% rename from apps/web/components/Form/Files.tsx rename to apps/web/components/Form/Documents/Files.tsx index 9c94302..81ad6b4 100644 --- a/apps/web/components/Form/Files.tsx +++ b/apps/web/components/Form/Documents/Files.tsx @@ -1,5 +1,5 @@ -import { FormContext } from './context/form-context'; -import type { FormComponentProps } from './types'; +import { FormContext } from '../context/form-context'; +import type { FormComponentProps } from '../types'; import { ArrowDownTrayIcon } from '@heroicons/react/24/solid'; import { Heading, InputFile } from '@repo/ui'; import Link from 'next/link'; diff --git a/apps/web/components/Form/Documents/index.ts b/apps/web/components/Form/Documents/index.ts new file mode 100644 index 0000000..c61d211 --- /dev/null +++ b/apps/web/components/Form/Documents/index.ts @@ -0,0 +1,2 @@ +export * from './Buttons'; +export * from './Files'; diff --git a/apps/web/components/Form/index.tsx b/apps/web/components/Form/index.tsx index a8f3c5b..6446ff8 100644 --- a/apps/web/components/Form/index.tsx +++ b/apps/web/components/Form/index.tsx @@ -1,8 +1,7 @@ 'use client'; -import { Buttons } from './Buttons'; +import * as Common from './Common'; import { FormContext, FormContextProvider } from './context/form-context'; -import { Elements } from './Elements'; -import { Files } from './Files'; +import * as Documents from './Documents'; import { Header } from './Header'; import { Overlay } from './Overlay'; import type { FormComponentProps } from './types'; @@ -19,11 +18,12 @@ function Content(props: FormComponentProps) {
- + + - + + - ); }