chatty / client /src /hooks /useFetch.jsx
arabdullah's picture
@ARAbdullaSL
a0fda44 verified
import { useState } from "react";
import { useDispatch } from "react-redux";
import { notificationActions } from "../store/notificationSlice";
const useFetch = ({ method, url }, successFn, errorFn) => {
const [requestState, setRequestState] = useState();
const dispatch = useDispatch();
const requestFunction = async (values) => {
const methodUpper = method.toUpperCase();
const fetchOptions =
methodUpper !== "GET"
? {
method: methodUpper,
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(values),
}
: {};
try {
setRequestState("loading");
const response = await fetch(`/api${url}`, fetchOptions);
let data;
if (methodUpper !== "DELETE") {
data = await response.json();
}
if (!response.ok) throw new Error(data.message);
setRequestState("success");
successFn && successFn(data);
return data;
} catch (error) {
setRequestState("error");
dispatch(
notificationActions.addNotification({
message: error.message,
type: "error",
})
);
errorFn && errorFn(error);
}
};
return {
reqState: requestState,
reqFn: requestFunction,
};
};
export default useFetch;