MatthiasMargot/redux-communication

View on GitHub
src/create-communication-middleware/create-communication-middleware.js

Summary

Maintainability
A
3 hrs
Test Coverage
import { isRequestAction }                                                 from '../is-request-action'
import { createRequestSucceededActionType, createRequestFailedActionType } from '../create-communication-action-type'
import overwriteDeep                                                       from '../overwrite-deep/overwrite-deep'
import { REQUEST_FAILED, REQUEST_SUCCEEDED }                               from '../action-types'

const createCommunicationMiddleware = () => store => next => action => {
  next(action)

  if (!isRequestAction(action)) return

  const {
    meta,
    payload = {},
  } = action

  const {
    namespace,
    request,
    partialSuccessAction = {},
    partialFailureAction = {},
  } = meta

  const args = payload.requestArgs || []

  return request(...args)
    .then(response => {
      const successAction = overwriteDeep(
        {
          type:    createRequestSucceededActionType(namespace),
          payload: { response },
          meta:    {
            namespace,
            requestLifecycleType: REQUEST_SUCCEEDED,
          },
        },
        partialSuccessAction,
      )

      store.dispatch(successAction)

      return response
    })
    .catch(error => {
      const failureAction = overwriteDeep(
        {
          type:    createRequestFailedActionType(namespace),
          payload: { error },
          meta:    {
            namespace,
            requestLifecycleType: REQUEST_FAILED,
          },
        },
        partialFailureAction,
      )

      store.dispatch(failureAction)

      throw error
    })
}

export default createCommunicationMiddleware