Proyectos de Subversion LeadersLinked - SPA

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3416 stevensc 1
import { useState, useCallback, useEffect } from "react";
2
 
3427 stevensc 3
export function useApi(
4
  apiFunction,
5
  options = {
6
    autofetch: false,
7
    autofetchDependencies: [],
8
    initialArgs: [],
3428 stevensc 9
    onSuccess: () => {},
10
    onError: () => {},
3427 stevensc 11
  }
12
) {
3416 stevensc 13
  const [data, setData] = useState(null);
14
  const [error, setError] = useState(null);
15
  const [loading, setLoading] = useState(false);
3426 stevensc 16
  const {
17
    autofetch = false,
18
    autofetchDependencies = [],
19
    initialArgs = [],
3428 stevensc 20
    onSuccess = () => {},
21
    onError = () => {},
3426 stevensc 22
  } = options;
3416 stevensc 23
 
24
  const execute = useCallback(
25
    async (...args) => {
26
      setLoading(true);
27
      setData(null);
28
      setError(null);
29
      try {
30
        const result = await apiFunction(...args);
31
        setData(result);
32
        return result;
33
      } catch (err) {
34
        setError(err);
35
        throw err;
36
      } finally {
37
        setLoading(false);
38
      }
39
    },
40
    [apiFunction]
41
  );
42
 
43
  useEffect(() => {
3426 stevensc 44
    if (autofetch) {
3428 stevensc 45
      execute(...initialArgs)
46
        .then(onSuccess)
47
        .catch(onError);
3416 stevensc 48
    }
49
    // eslint-disable-next-line react-hooks/exhaustive-deps
3426 stevensc 50
  }, [autofetch, execute, ...autofetchDependencies, ...initialArgs]);
3416 stevensc 51
 
52
  return { loading, data, error, execute };
53
}