Rev 3416 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import { useState, useEffect } from 'react'
import { useDispatch } from 'react-redux'
import { axios } from '@utils'
import { asyncLogout } from '@store/auth/auth.actions'
import { addNotification } from '@store/notification/notification.actions'
export function useFetch(url, defaultValue = {}) {
const [data, setData] = useState(defaultValue)
const [isLoading, setIsLoading] = useState(true)
const dispatch = useDispatch()
const handleError = (response) => {
const { success, data } = response.data
if (!data) {
return response.data
}
if (!success) {
const errorMessage =
typeof data === 'string'
? data
: Object.entries(data)
.map(([key, value]) => `${key}: ${value}`)
.join(', ')
throw new Error(errorMessage)
}
return data
}
const getResources = (url) => {
if (!url) return
setIsLoading(true)
axios
.get(url)
.then((response) => handleError(response))
.then((data) => setData(data))
.catch((error) => {
dispatch(addNotification({ style: 'danger', msg: error.message }))
if (error.message.includes('sesión')) dispatch(asyncLogout())
})
.finally(() => setIsLoading(false))
}
const refetch = () => getResources(url)
const mutate = (data) => setData(data)
useEffect(() => {
getResources(url)
}, [url])
return {
data,
mutate,
isLoading,
refetch
}
}