useForm.ts 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import fetchApi, { ApiMethods, ApiPaths } from "./../utils/api";
  2. import { FormEventHandler, useState } from "react";
  3. type useFormProps = {
  4. path: ApiPaths;
  5. query?: string;
  6. method: ApiMethods;
  7. };
  8. type FormMessage = {
  9. message: string;
  10. };
  11. const useForm = ({ path, method, query }: useFormProps) => {
  12. const [error, setError] = useState<FormMessage>();
  13. const [loading, setLoading] = useState(false);
  14. const [success, setSuccess] = useState<FormMessage>();
  15. const submitHandler: FormEventHandler<HTMLFormElement> = async (event) => {
  16. event.preventDefault();
  17. setLoading(true);
  18. const formData = new FormData(event.currentTarget);
  19. const { error, message } = await fetchApi({
  20. path,
  21. query,
  22. method,
  23. body: Object.fromEntries(formData.entries()),
  24. });
  25. if (error) {
  26. setLoading(false);
  27. setError({ message: error });
  28. } else {
  29. setLoading(false);
  30. setSuccess({ message: message || "Success!" });
  31. }
  32. };
  33. return { error, loading, success, submitHandler };
  34. };
  35. export default useForm;