From 1c40f96a4de18b0a96f636a2ef7c773d091f9a57 Mon Sep 17 00:00:00 2001 From: James Barnsley Date: Wed, 25 Oct 2017 21:04:51 +1300 Subject: [PATCH] Exceptions handled by Analytics --- src/js/components/Notifications.js | 3 ++- src/js/services/core/middleware.js | 37 +++++++++++++++++++++++------- src/js/services/ui/actions.js | 3 ++- src/js/services/ui/middleware.js | 1 + 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/js/components/Notifications.js b/src/js/components/Notifications.js index e13ca37c..52e9fdfc 100755 --- a/src/js/components/Notifications.js +++ b/src/js/components/Notifications.js @@ -28,7 +28,8 @@ export default class Notifications extends React.Component{
this.props.uiActions.removeNotification(notification.key) } /> {notification.title ?

{notification.title}

: null} -

+

+ {notification.description ?

: null }
) } diff --git a/src/js/services/core/middleware.js b/src/js/services/core/middleware.js index cf4b799b..ea50c489 100755 --- a/src/js/services/core/middleware.js +++ b/src/js/services/core/middleware.js @@ -19,7 +19,18 @@ const CoreMiddleware = (function(){ switch(action.type){ case 'HANDLE_EXCEPTION': + + // Construct meaningful message and description var message = action.message; + var description = null; + if (action.data.xhr && action.data.xhr.responseText){ + var xhr_response = JSON.parse(action.data.xhr.responseText); + if (xhr_response.error && xhr_response.error.message){ + description = xhr_response.error.message; + } + } + + // Prepare a summary dump of our state var state = store.getState(); var exported_state = { core: Object.assign({},state.core), @@ -48,25 +59,35 @@ const CoreMiddleware = (function(){ {}, action.data, { + message: message, + description: description, state: exported_state } ); + // Log with Raven Sentry Raven.captureException( - new Error(action.message), + new Error(message), { extra: data } ); - if (action.data.xhr && action.data.xhr.responseText){ - var xhr_response = JSON.parse(action.data.xhr.responseText); - if (xhr_response.error && xhr_response.error.message){ - message = message+'

'+xhr_response.error.message+'

'; - } - } + // Log with Analytics + ReactGA.event({ + category: "Error", + action: message, + label: (description ? description : "No description"), + nonInteraction: true + }); - store.dispatch(uiActions.createNotification(message,'bad')); + store.dispatch(uiActions.createNotification( + message, + 'bad', + null, + null, + description + )); console.error(action.message, data); break; diff --git a/src/js/services/ui/actions.js b/src/js/services/ui/actions.js index 7c963240..24595fd7 100755 --- a/src/js/services/ui/actions.js +++ b/src/js/services/ui/actions.js @@ -128,7 +128,7 @@ export function createBrowserNotification(data){ } } -export function createNotification(content, type = 'default', key = null, title = null, sticky = false){ +export function createNotification(content, type = 'default', key = null, title = null, description = null, sticky = false){ if (!key){ key = helpers.generateGuid() } @@ -138,6 +138,7 @@ export function createNotification(content, type = 'default', key = null, title key: key, type: type, title: title, + description: description, content: content, sticky: sticky } diff --git a/src/js/services/ui/middleware.js b/src/js/services/ui/middleware.js index 703b23fd..8e8bc9c6 100755 --- a/src/js/services/ui/middleware.js +++ b/src/js/services/ui/middleware.js @@ -113,6 +113,7 @@ const UIMiddleware = (function(){ 'broadcast', (broadcast.key ? broadcast.key : null), (broadcast.title ? broadcast.title : null), + null, true )) }