Proyectos de Subversion LeadersLinked - SPA

Rev

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
  }
}