useForm.ts 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import { ApiResulState, FetchApiInterface } from "./../utils/api";
  2. import { FormEventHandler, useState } from "react";
  3. type FormMessage = {
  4. message: string;
  5. };
  6. type Success = FormMessage & {
  7. result: Partial<User>;
  8. };
  9. type SubmitHandler = FormEventHandler<HTMLFormElement>;
  10. type UseForm = {
  11. loading: boolean;
  12. submitHandler: SubmitHandler;
  13. error?: FormMessage;
  14. success?: Success;
  15. };
  16. const useForm = <T>(fetchApi: FetchApiInterface<T>): UseForm => {
  17. const [error, setError] = useState<FormMessage>();
  18. const [loading, setLoading] = useState(false);
  19. const [success, setSuccess] = useState<Success>();
  20. const submitHandler: FormEventHandler<HTMLFormElement> = async (event) => {
  21. event.preventDefault();
  22. setLoading(true);
  23. const formData = new FormData(event.currentTarget);
  24. const body = Object.fromEntries(formData.entries()) as unknown as T;
  25. const result = await fetchApi(body);
  26. setLoading(false);
  27. switch (result.state) {
  28. case ApiResulState.SUCCESS: {
  29. setSuccess({ message: result.message, result: result.user });
  30. break;
  31. }
  32. case ApiResulState.ERROR: {
  33. setError({ message: result.error });
  34. break;
  35. }
  36. }
  37. };
  38. return { error, loading, success, submitHandler };
  39. };
  40. export default useForm;