UNPKG

@jamsesso/use-async

Version:

useAsync is a React hook that makes using async functions in your components easier

60 lines (53 loc) 1.34 kB
"use strict"; const React = require('react'); function useAsync(f, options) { if (typeof options !== 'object') { options = { initialState: { loading: true } }; } var reducer = React.useReducer(function (prevState, action) { switch (action.type) { case 'LOADING': return { loading: true, error: false, result: null }; case 'ERROR': return { loading: false, error: action.error, result: null }; case 'SUCCESS': return { loading: false, error: false, result: action.payload }; default: return prevState; } }, { loading: options.initialState.loading, error: null, result: null }); var state = reducer[0]; var dispatch = reducer[1]; var wrapped = React.useCallback( function () { dispatch({ type: 'LOADING' }); return f.apply(void 0, arguments) .then( function (payload) { dispatch({ type: 'SUCCESS', payload: payload }); return Promise.resolve(payload); } ).catch( function (error) { dispatch({ type: 'ERROR', error: error }); } ); }, [dispatch, f] ); return React.useMemo( function () { return [wrapped, state]; }, [wrapped, state] ); } module.exports = useAsync;