Proyectos de Subversion LeadersLinked - SPA

Rev

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

import { useState, useCallback, useEffect } from 'react';

const defaultOptions = {
  onSuccess: () => {},
  onError: () => {},
  autoFetch: false,
  autoFetchArgs: []
};

export function useApi(apiFunction, options = defaultOptions) {
  const { onSuccess, onError, autoFetch, autoFetchArgs } = {
    ...defaultOptions,
    ...options
  };

  const [data, setData] = useState(null);
  const [error, setError] = useState(null);
  const [loading, setLoading] = useState(false);

  const execute = useCallback(
    async (...args) => {
      setLoading(true);
      setData(null);
      setError(null);
      try {
        const result = await apiFunction(...args);
        setData(result);
        onSuccess(result);
        return result;
      } catch (err) {
        console.error('Error on api: ', err);
        setError(err.message);
        onError(err);
      } finally {
        setLoading(false);
      }
    },
    [apiFunction]
  );

  useEffect(() => {
    if (autoFetch) {
      execute(...autoFetchArgs);
    }
  }, [autoFetch, JSON.stringify(autoFetchArgs)]);

  return { loading, data, error, execute };
}