import type { Dispatch, RefObject, SetStateAction } from "react"; import { useEffect, useState } from "react"; import { getElRefHelper } from "./getElRefHelper"; import { useFormValidation } from "./useFormValidation"; import { FormSend } from "../../plugins/forms/send"; type TUseValidFormSendReturn = { isLoading: boolean; isValid: boolean | null; setIsLoading: Dispatch>; setIsValid: Dispatch>; }; /** * Хук позволяет выполнить функцию после валидации формы * @template TResult - тип значения, которым резолвится Promise в колбэке `onValid`. * @returns {TUseValidFormSendReturn} Возвращает состояние отправки (`isLoading`), состояние валидации (`isValid`) и соответствующие setter-функции. * @example * import { useValidFormSend } from "@delement/ui/utils/react"; * import { Form } from "@delement/ui/components"; * import { useRef } from "react"; * * export const App = () => { * const formRef = useRef(null); * const onConfirm = (e) => console.debug(e); * const { isLoading } = useValidFormSend(formRef, onConfirm); * * return
* } */ export const useValidFormSend = ( formRef: RefObject, onValid?: (fd: FormData) => Promise ): TUseValidFormSendReturn => { const [ isLoading, setIsLoading ] = useState(false); const { isValid, setIsValid } = useFormValidation(formRef, null, "form"); useEffect(() => { if (isValid) { const formEl = getElRefHelper(formRef); if (typeof onValid === "function" && !!formEl) { const fd = FormSend.getFormData(formEl as HTMLFormElement); setIsLoading(true); const onFinally = () => { setIsLoading(false); setIsValid(null); }; try { onValid(fd) .finally(() => { onFinally(); }); } catch (e) { console.error(`[useValidFormSend] "onValid" callback must return Promise!`, e); onFinally(); } } } }, [ isValid ]); return { isLoading, isValid, setIsLoading, setIsValid, }; };