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,
}),
);
};