import Raven from 'raven-js'; import AppConstants from '../constants/application_constants'; /** * Logs an error in to the console but also sends it to * Sentry. * Optionally, a comment can be defined. * @param {Error} error a Javascript error * @param {boolean} ignoreSentry Defines whether or not the error should be submitted to Sentry * @param {string} comment Will also be submitted to Sentry, but will not be logged */ function logGlobal(error, comment, ignoreSentry) { console.error(error); if (error.hasOwnProperty('json')) { comment.json = error.json; } if (!ignoreSentry) { Raven.captureException(error, comment ? { extra: { comment } } : undefined); } } export function initLogging() { const { raven: { ignoreErrors, url: ravenUrl }, version } = AppConstants; // Initialize Raven for logging on Sentry Raven.config(ravenUrl, { ignoreErrors, release: version, }).install(); window.onerror = Raven.process; console.logGlobal = logGlobal; } /* * Gets the json errors from the error as an array * @param {Error} error A Javascript error * @return {Array} List of json errors */ export function getJsonErrorsAsArray(error) { const { json: { errors = {} } = {} } = error; const errorArrays = Object .keys(errors) .map((errorKey) => errors[errorKey]); // Collapse each errorKey's errors into a flat array return [].concat(...errorArrays); } /* * Tries to get an error message from the error, either by using its notification * property or first json error (if any) * @param {Error} error A Javascript error * @return {string} Error message string */ export function getErrorNotificationMessage(error) { return (error && error.notification) || getJsonErrorsAsArray(error)[0] || ''; }