import { createReducer } from '@chipp972/redux-helpers'; import * as R from 'ramda'; import { actions, defaultRequest, reducerKey } from './redux-ajax.constants'; import { isRequestAbortable } from './redux-ajax.helpers'; import { ReduxAjaxParams, ReduxAjaxState, RequestStatus } from './redux-ajax.type'; export const reduxAjaxReducerKey = reducerKey; export const reduxAjaxReducer = createReducer( { [actions.AJAX_REQUEST_SET_REQUEST_PARAMS]: ( state, { requestId, ...requestParams }: ReduxAjaxParams & { requestId: string } ) => R.mergeDeepRight(state, { [requestId]: { ...defaultRequest, ...state[requestId], ...requestParams } }), [actions.AJAX_REQUEST_INTENTED]: (state, { requestId }: { requestId: string }) => R.mergeDeepRight(state, { [requestId]: { error: null, status: RequestStatus.INTENTED } }), [actions.AJAX_REQUEST_PENDING]: (state, { requestId }: { requestId: string }) => R.mergeDeepRight(state, { [requestId]: { error: null, status: RequestStatus.PENDING } }), [actions.AJAX_REQUEST_SUCCESS]: (state, { requestId, response }: { requestId: string; response: object }) => ({ ...state, [requestId]: { ...state[requestId], response, error: null, status: RequestStatus.SUCCESS } }), [actions.AJAX_REQUEST_FAILURE]: (state, { requestId, error }: { requestId: string; error: object }) => R.mergeDeepRight(state, { [requestId]: { error, response: null, status: RequestStatus.FAILURE } }), [actions.AJAX_REQUEST_RESET]: (state, { requestId }: { requestId: string }) => ({ ...state, [requestId]: defaultRequest }), [actions.AJAX_REQUEST_RESPONSE_RESET]: (state, { requestId }: { requestId: string }) => R.mergeDeepRight(state, { [requestId]: { status: defaultRequest.status, error: defaultRequest.error, response: defaultRequest.response } }), [actions.AJAX_REQUEST_ABORT]: (state, { requestId }: { requestId: string }) => R.mergeDeepRight(state, { [requestId]: { status: isRequestAbortable(state[requestId]) ? RequestStatus.ABORTED : state[requestId].status } }) }, {} );