react-clone-trello
39 строк · 1.2 Кб
1import { ChangeEvent, FormEvent, useEffect, useState } from "react";
2import { useAppDispatch } from "../services/store/hooks";
3import { useNavigate } from "react-router";
4import { ROUTE } from "../utils/constants";
5
6interface IFormValues {
7email?: string;
8name?: string;
9password?: string;
10}
11
12export const useForm = <T extends IFormValues>(input: T) => {
13const [formState, setFormState] = useState(input);
14const [isFormValid, setIsFormValid] = useState(true);
15const dispatch = useAppDispatch();
16const navigate = useNavigate();
17
18const onChange = (e: ChangeEvent<HTMLInputElement>) => {
19setFormState({
20...formState,
21[e.target.name]: e.target.value,
22});
23};
24
25useEffect(() => {
26const isValid = Object.values(!formState).every((value) => !!value);
27setIsFormValid(isValid);
28}, [formState]);
29
30const onSubmit = (e: FormEvent<HTMLFormElement>, asyncThunk: any) => {
31e.preventDefault();
32dispatch(asyncThunk(formState))
33.then(() => navigate(`${ROUTE.home}`, { replace: true }))
34.catch((error: unknown) => console.error(error));
35setFormState(input);
36};
37
38return { formState, setFormState, onChange, onSubmit, isFormValid };
39};
40