Spaces:
Paused
Paused
| 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; | |