Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3658 stevensc 1
import { useState, useCallback, useEffect } from 'react';
3481 stevensc 2
 
3575 stevensc 3
const defaultOptions = {
4
  onSuccess: () => {},
3658 stevensc 5
  onError: () => {},
6
  autoFetch: false,
7
  autoFetchArgs: []
3575 stevensc 8
};
9
 
10
export function useApi(apiFunction, options = defaultOptions) {
3658 stevensc 11
  const { onSuccess, onError, autoFetch, autoFetchArgs } = {
12
    ...defaultOptions,
13
    ...options
14
  };
3575 stevensc 15
 
3481 stevensc 16
  const [data, setData] = useState(null);
17
  const [error, setError] = useState(null);
18
  const [loading, setLoading] = useState(false);
19
 
20
  const execute = useCallback(
21
    async (...args) => {
22
      setLoading(true);
23
      setData(null);
24
      setError(null);
25
      try {
26
        const result = await apiFunction(...args);
27
        setData(result);
3575 stevensc 28
        onSuccess(result);
3481 stevensc 29
        return result;
30
      } catch (err) {
3496 stevensc 31
        console.error('Error on api: ', err);
32
        setError(err.message);
3575 stevensc 33
        onError(err);
3481 stevensc 34
      } finally {
35
        setLoading(false);
36
      }
37
    },
3575 stevensc 38
    [apiFunction, onSuccess, onError]
3481 stevensc 39
  );
40
 
3658 stevensc 41
  useEffect(() => {
42
    if (autoFetch) {
43
      execute(...autoFetchArgs);
44
    }
45
  }, [execute, autoFetch, JSON.stringify(autoFetchArgs)]);
46
 
3481 stevensc 47
  return { loading, data, error, execute };
48
}