import React from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { getRequestFailureComponent, getRequestPendingComponent, getRequestSuccessComponent } from './components/wrappers'; import { abortRequest, setRequestParams, submitRequest, submitReset, submitResponseReset } from './redux-ajax.actions'; import { getError, getResponse, getStatus, hasError, hasResponse, isRequestAborted, isRequestComplete, isRequestFailed, isRequestPending, isRequestSuccessful } from './redux-ajax.selector'; import { AjaxSubmitRequestData, ReduxAjaxParams } from './redux-ajax.type'; export const useReduxAjax = (requestId: string) => { const dispatch = useDispatch(); return { Success: getRequestSuccessComponent(requestId), Failure: getRequestFailureComponent(requestId), Loading: getRequestPendingComponent(requestId), setRequestParams: React.useCallback( (params: ReduxAjaxParams) => dispatch(setRequestParams({ requestId, ...params })), [] ), submitRequest: React.useCallback( (params: AjaxSubmitRequestData) => dispatch(submitRequest({ requestId, ...params })), [] ), resetRequest: React.useCallback(() => dispatch(submitReset({ requestId })), []), resetResponse: React.useCallback(() => dispatch(submitResponseReset({ requestId })), []), abortRequest: React.useCallback(() => dispatch(abortRequest({ requestId })), []), isRequestPending: useSelector(isRequestPending(requestId)), isRequestSuccessful: useSelector(isRequestSuccessful(requestId)), isRequestFailed: useSelector(isRequestFailed(requestId)), isRequestComplete: useSelector(isRequestComplete(requestId)), isRequestAborted: useSelector(isRequestAborted(requestId)), hasResponse: useSelector(hasResponse(requestId)), response: useSelector(getResponse(requestId)), error: useSelector(getError(requestId)), hasError: useSelector(hasError(requestId)), status: useSelector(getStatus(requestId)) }; };