import { INode } from '~/redux/types'; import { FileUploader } from '~/utils/hooks/useFileUploader'; import { useCallback, useRef } from 'react'; import { FormikConfig, FormikHelpers, useFormik, useFormikContext } from 'formik'; import { object } from 'yup'; import { keys } from 'ramda'; import { showErrorToast } from '~/utils/errors/showToast'; const validationSchema = object().shape({}); const afterSubmit = ({ resetForm, setStatus, setSubmitting, setErrors }: FormikHelpers) => ( e?: string, errors?: Record ) => { setSubmitting(false); if (e) { setStatus(e); showErrorToast(e); return; } if (errors && keys(errors).length) { setErrors(errors); return; } if (resetForm) { resetForm(); } }; export const useNodeFormFormik = ( values: INode, uploader: FileUploader, stopEditing: () => void, sendSaveRequest: (node: INode) => Promise ) => { const { current: initialValues } = useRef(values); const onReset = useCallback(() => { uploader.setFiles([]); if (stopEditing) stopEditing(); }, [uploader, stopEditing]); const onSubmit = useCallback['onSubmit']>( async (values, helpers) => { try { await sendSaveRequest({ ...values, files: uploader.files }); afterSubmit(helpers)(); } catch (error) { afterSubmit(helpers)(error?.response?.data?.error, error?.response?.data?.errors); } }, [sendSaveRequest, uploader.files] ); return useFormik({ initialValues, validationSchema, onSubmit, onReset, initialStatus: '', validateOnChange: true, }); }; export const useNodeFormContext = () => useFormikContext();