diff --git a/public/index.html b/public/index.html index a44870848..6fa0548e1 100644 --- a/public/index.html +++ b/public/index.html @@ -43,7 +43,7 @@ 'Unhandled rejection (promise: ', event.promise, ', reason: ', - event.reason, + JSON.stringify(event.reason, ['message', 'arguments', 'type', 'name']), ').', JSON.stringify(event.promise) ); diff --git a/src/app/App.jsx b/src/app/App.jsx index 817da1654..839c741ba 100644 --- a/src/app/App.jsx +++ b/src/app/App.jsx @@ -28,11 +28,16 @@ const App = () => { }; React.useEffect(() => { - api_base.api.expectResponse('authorize').then(() => - api_base.getActiveSymbols().then(data => { - initActiveSymbols(data); - }) - ); + api_base.api + .expectResponse('authorize') + .then(() => + api_base.getActiveSymbols().then(data => { + initActiveSymbols(data); + }) + ) + .catch(error => { + globalObserver.emit('Error', error); + }); /* This code is used to monitor active_symbols when the user is not logged in and will initialize the app without requiring an authorization response. */ diff --git a/src/blockly/blocks/tools/loader.js b/src/blockly/blocks/tools/loader.js index 2d08ba893..b0c64351e 100644 --- a/src/blockly/blocks/tools/loader.js +++ b/src/blockly/blocks/tools/loader.js @@ -1,6 +1,8 @@ import { translate } from '@i18n'; import { observer as globalObserver } from '@utilities/observer'; +import { TrackJSError } from '@utilities/logger'; import { deleteBlocksLoadedBy, loadRemote, recoverDeletedBlock } from '../../utils'; +import { trackJSTrack } from '../../../utilities/integrations/trackJSTrack'; Blockly.Blocks.loader = { init: function init() { @@ -44,7 +46,10 @@ Blockly.Blocks.loader = { }, e => { Blockly.Events.recordUndo = recordUndo; - throw e; + const serialized_error = JSON.stringify(e, ['message', 'arguments', 'type', 'name']); + trackJSTrack( + new TrackJSError(translate('Blocks aren`t loaded successfully'), `${e}, ${serialized_error}`) + ); } ); } diff --git a/src/blockly/index.js b/src/blockly/index.js index b3614e5e3..557836f69 100644 --- a/src/blockly/index.js +++ b/src/blockly/index.js @@ -259,7 +259,8 @@ export const loadWorkspace = xml => { }, e => { Blockly.Events.setGroup(false); - throw e; + const serialized_error = JSON.stringify(e, ['message', 'arguments', 'type', 'name']); + trackJSTrack(new TrackJSError(translate('Blocks aren`t loaded successfully'), `${e}, ${serialized_error}`)); } ); }; @@ -287,7 +288,8 @@ export const loadBlocks = (xml, dropEvent = {}) => { globalObserver.emit('ui.log.success', translate('Blocks are loaded successfully')); }, e => { - throw e; + const serialized_error = JSON.stringify(e, ['message', 'arguments', 'type', 'name']); + trackJSTrack(new TrackJSError(translate('Blocks aren`t loaded successfully'), `${e} ${serialized_error}`)); } ); }; @@ -502,10 +504,15 @@ export default class _Blockly { }); } if (this.interpreter) { - this.interpreter.stop().then(() => { - this.interpreter = null; - resolve(); - }); + this.interpreter + .stop() + .then(() => { + this.interpreter = null; + resolve(); + }) + .catch(error => { + globalObserver.emit('Error', error); + }); } else { resolve(); } diff --git a/src/common/appId.js b/src/common/appId.js index 5286a386e..f3032c01e 100644 --- a/src/common/appId.js +++ b/src/common/appId.js @@ -13,6 +13,8 @@ import { } from '@storage'; import { getRelatedDerivOrigin } from '@utils'; import GTM from '@utilities/integrations/gtm'; +import { TrackJSError } from '@utilities/logger'; +import { trackJSTrack } from '@utilities/integrations/trackJSTrack'; const generateOAuthDomain = () => { const related_deriv_origin = getRelatedDerivOrigin(); @@ -48,6 +50,8 @@ export async function addTokenIfValid(token) { return account; } catch (e) { GTM.setVisitorId(); + const serialized_error = JSON.stringify(e, ['message', 'arguments', 'type', 'name']); + trackJSTrack(new TrackJSError(`${e}, ${serialized_error}`)); throw e; } } @@ -106,6 +110,8 @@ export async function loginAndSetTokens(token_list = []) { return { account_info, accounts_list }; } catch (e) { GTM.setVisitorId(); + const serialized_error = JSON.stringify(e, ['message', 'arguments', 'type', 'name']); + trackJSTrack(new TrackJSError(`${e}, ${serialized_error}`)); throw e; } } diff --git a/src/components/Header/Header.jsx b/src/components/Header/Header.jsx index 425f61569..f7fa29278 100644 --- a/src/components/Header/Header.jsx +++ b/src/components/Header/Header.jsx @@ -72,13 +72,18 @@ const Header = () => { }, [login_id]); React.useEffect(() => { - api_base.api.expectResponse('balance').then(({ balance }) => { - dispatch(client_slice.updateBalance(balance)); - globalObserver.setState({ - balance: Number(balance.balance), - currency: balance.currency, + api_base.api + .expectResponse('balance') + .then(({ balance }) => { + dispatch(client_slice.updateBalance(balance)); + globalObserver.setState({ + balance: Number(balance.balance), + currency: balance.currency, + }); + }) + .catch(error => { + globalObserver.emit('Error', error); }); - }); api_base.api.onMessage().subscribe(({ data }) => { if (data.msg_type === 'balance') { diff --git a/src/components/ToolBox/save/save.jsx b/src/components/ToolBox/save/save.jsx index 6be25b6a0..dc5d24cf1 100644 --- a/src/components/ToolBox/save/save.jsx +++ b/src/components/ToolBox/save/save.jsx @@ -3,6 +3,8 @@ import React from 'react'; import { translate } from '@i18n'; import { observer as globalObserver } from '@utilities/observer'; import google_drive_util from '@utilities/integrations/GoogleDrive'; +import { TrackJSError } from '@utilities/logger'; +import { trackJSTrack } from '@utilities/integrations/trackJSTrack'; import LoadingButton from '../loading_button'; import SAVE_LOAD_TYPE from '../common'; import useIsMounted from '../../../common/hooks/isMounted'; @@ -33,6 +35,10 @@ const Save = ({ blockly, closeDialog, is_gd_logged_in }) => { mimeType: 'application/xml', }) .then(() => globalObserver.emit('ui.log.success', translate('Successfully uploaded to Google Drive'))) + .catch(e => { + const serialized_error = JSON.stringify(e, ['message', 'arguments', 'type', 'name']); + trackJSTrack(new TrackJSError(`${e}, ${serialized_error}`)); + }) .finally(() => isMounted() && setLoading(false)); }; const onSubmit = e => { diff --git a/src/utilities/integrations/GoogleDrive.js b/src/utilities/integrations/GoogleDrive.js index 71b90a8de..0bdce96b3 100644 --- a/src/utilities/integrations/GoogleDrive.js +++ b/src/utilities/integrations/GoogleDrive.js @@ -117,7 +117,11 @@ class GoogleDriveUtil { store.dispatch(setGdLoggedIn(false)); this.updateLoginStatus(true); }; - this.client.requestAccessToken({ prompt: '' }); + try { + this.client.requestAccessToken({ prompt: '' }); + } catch (err) { + trackJSTrack(new TrackJSError(err)); + } } }; @@ -129,8 +133,12 @@ class GoogleDriveUtil { logout = () => { this.updateLoginStatus(false); if (this.access_token) { - gapi.client.setToken(''); - google.accounts.oauth2.revoke(this.access_token); + try { + gapi.client.setToken(''); + google.accounts.oauth2.revoke(this.access_token); + } catch (err) { + trackJSTrack(new TrackJSError(err)); + } localStorage.removeItem('access_token'); } this.access_token = '';