Spaces:
Paused
Paused
File size: 1,334 Bytes
a0fda44 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
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;
|