useForm.ts 1022 B

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