Source: app/actions/errorActions.js

import createAction from 'redux-actions/lib/createAction';
import UserRole from '../data/enum/UserRole';
import { userAccountSelector } from '../selectors/userAccountSelectors';
import GatewayError from '../net/gateway/GatewayError';

export const ADD_ERROR = 'errorActions/ADD_ERROR';
export const CLEAR_ERRORS = 'errorActions/CLEAR_ERRORS';

export const clearErrors = createAction(CLEAR_ERRORS);

/**
 * @param {string} errorCode
 * @param {string} errorMessage
 * @param {number} statusCode The http status code that should be used when displaying this error
 */
export const addError = createAction(
  ADD_ERROR,
  ({ errorCode, errorMessage, statusCode, stack }) => ({
    statusCode,
    code: errorCode,
    message: errorMessage,
    stack,
  }),
);

export const handleRuntimeError = error => (dispatch, getState) => {
  const state = getState();
  const account = userAccountSelector(state);

  const isDeveloper = account && account.roles && account.roles.includes(UserRole.DEVELOPER);
  const isGatewayError = error instanceof GatewayError;
  let errorCode = 'errors.runtime';
  if (isGatewayError) {
    errorCode = error.response.status === 404 ? 'errors.notFound' : 'errors.gateway';
  }

  dispatch(
    addError({
      errorCode,
      statusCode: (isGatewayError && error.response.status) || 500,
      stack: error && isDeveloper ? error.stack : null,
      errorMessage: error && isDeveloper ? error.message : null,
    }),
  );
};