Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3416 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3432 stevensc 1
import { useState, useEffect } from 'react'
2
import { useDispatch } from 'react-redux'
707 stevensc 3
 
3432 stevensc 4
import { axios } from '@utils'
5
import { asyncLogout } from '@store/auth/auth.actions'
6
import { addNotification } from '@store/notification/notification.actions'
2210 stevensc 7
 
2774 stevensc 8
export function useFetch(url, defaultValue = {}) {
3432 stevensc 9
  const [data, setData] = useState(defaultValue)
10
  const [isLoading, setIsLoading] = useState(true)
11
  const dispatch = useDispatch()
707 stevensc 12
 
3432 stevensc 13
  const handleError = (response) => {
14
    const { success, data } = response.data
15
 
16
    if (!data) {
17
      return response.data
2210 stevensc 18
    }
19
 
3432 stevensc 20
    if (!success) {
21
      const errorMessage =
22
        typeof data === 'string'
23
          ? data
24
          : Object.entries(data)
25
              .map(([key, value]) => `${key}: ${value}`)
26
              .join(', ')
27
      throw new Error(errorMessage)
28
    }
29
 
30
    return data
31
  }
32
 
33
  const getResources = (url) => {
34
    if (!url) return
35
 
36
    setIsLoading(true)
37
 
38
    axios
39
      .get(url)
40
      .then((response) => handleError(response))
41
      .then((data) => setData(data))
42
      .catch((error) => {
43
        dispatch(addNotification({ style: 'danger', msg: error.message }))
44
        if (error.message.includes('sesión')) dispatch(asyncLogout())
45
      })
46
      .finally(() => setIsLoading(false))
47
  }
48
 
49
  const refetch = () => getResources(url)
50
 
51
  const mutate = (data) => setData(data)
52
 
53
  useEffect(() => {
54
    getResources(url)
55
  }, [url])
56
 
707 stevensc 57
  return {
3432 stevensc 58
    data,
59
    mutate,
60
    isLoading,
61
    refetch
62
  }
707 stevensc 63
}