diff --git a/app/assets/javascripts/app.ts b/app/assets/javascripts/app.ts index 9fdb061f2..2b434fb09 100644 --- a/app/assets/javascripts/app.ts +++ b/app/assets/javascripts/app.ts @@ -3,6 +3,7 @@ declare const __VERSION__: string; declare const __WEB__: boolean; +import { SNLog } from 'snjs'; import angular from 'angular'; import { configRoutes } from './routes'; @@ -64,11 +65,14 @@ if (__WEB__) { (window as any).startApplication = startApplication; } -function startApplication( +async function startApplication( defaultSyncServerHost: string, bridge: Bridge ) { - startErrorReporting(); + + SNLog.onLog = console.log; + await startErrorReporting(); + angular.module('app', ['ngSanitize']); // Config @@ -142,4 +146,6 @@ function startApplication( }, }); } + + angular.bootstrap(document, ['app']); } diff --git a/app/assets/javascripts/directives/views/accountMenu.ts b/app/assets/javascripts/directives/views/accountMenu.ts index f09ba210a..253e57b1e 100644 --- a/app/assets/javascripts/directives/views/accountMenu.ts +++ b/app/assets/javascripts/directives/views/accountMenu.ts @@ -27,6 +27,7 @@ import { PasswordWizardType } from '@/types'; import { BackupFile } from 'snjs/dist/@types/services/protocol_service'; import { confirmDialog, alertDialog } from '@/services/alertService'; import { autorun, IReactionDisposer } from 'mobx'; +import { storage, StorageKey } from '@/services/localStorage'; const ELEMENT_ID_IMPORT_PASSWORD_INPUT = 'import-password-request'; @@ -65,6 +66,7 @@ type AccountMenuState = { encryptionEnabled: boolean; selectedAutoLockInterval: any; showBetaWarning: boolean; + errorReportingEnabled: boolean; } class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { @@ -96,6 +98,7 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { }, mutable: {}, showBetaWarning: false, + errorReportingEnabled: !storage.get(StorageKey.DisableErrorReporting), } as AccountMenuState; } @@ -587,6 +590,31 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { } } + openErrorReportingDialog() { + alertDialog({ + title: 'Data sent during automatic error reporting', + text: ` + We use Bugsnag to automatically + reports errors that occur while the app is running. + + See this article, paragraph 'Browser' under 'Sending diagnostic data', + + to know what data is automatically captured. + ` + }); + } + + toggleErrorReportingEnabled() { + if (this.state.errorReportingEnabled) { + storage.set(StorageKey.DisableErrorReporting, true); + } else { + storage.set(StorageKey.DisableErrorReporting, false); + } + if (!this.application.getSyncStatus().syncInProgress) { + window.location.reload(); + } + } + isDesktopApplication() { return isDesktopApplication(); } diff --git a/app/assets/javascripts/services/errorReporting.ts b/app/assets/javascripts/services/errorReporting.ts index 3229051ab..06816cb0e 100644 --- a/app/assets/javascripts/services/errorReporting.ts +++ b/app/assets/javascripts/services/errorReporting.ts @@ -1,14 +1,16 @@ +import { SNLog } from 'snjs'; import { isDesktopApplication, isDev } from '@/utils'; import { storage, StorageKey } from './localStorage'; -import Bugsnag from '@bugsnag/js'; declare const __VERSION__: string; export async function startErrorReporting() { if (storage.get(StorageKey.DisableErrorReporting)) { + SNLog.onError = console.error; return; } try { + const { default: Bugsnag } = await import('@bugsnag/js'); Bugsnag.start({ apiKey: (window as any)._bugsnag_api_key, appType: isDesktopApplication() ? 'desktop' : 'web', @@ -17,6 +19,13 @@ export async function startErrorReporting() { autoTrackSessions: false, releaseStage: isDev ? 'development' : undefined }); + if (isDev) { + SNLog.onError = console.error; + } else { + SNLog.onError = (error) => { + Bugsnag.notify(error); + } + } } catch (error) { console.error('Failed to start Bugsnag.', error); } diff --git a/app/assets/templates/directives/account-menu.pug b/app/assets/templates/directives/account-menu.pug index e55e232a0..799fa2c39 100644 --- a/app/assets/templates/directives/account-menu.pug +++ b/app/assets/templates/directives/account-menu.pug @@ -302,6 +302,18 @@ | the whole file, please use the Batch Manager extension. .sk-panel-row .sk-spinner.small.info(ng-if='self.state.importData.loading') + .sk-panel-section + .sk-panel-section-title Error Reporting + .sk-panel-section-subtitle.info + | Automatic error reporting is {{ self.state.errorReportingEnabled ? 'enabled.' : 'disabled.' }} + p.sk-p + | Help us improve Standard Notes by automatically submitting + | anonymized error reports. + .sk-panel-row + button(ng-click="self.toggleErrorReportingEnabled()").sk-button.info + span.sk-label {{ self.state.errorReportingEnabled ? 'Disable' : 'Enable'}} Error Reporting + .sk-panel-row + a(ng-click="self.openErrorReportingDialog()").sk-a What data is being sent? .sk-panel-footer .sk-panel-row .sk-p.left.neutral diff --git a/app/views/application/app.html.erb b/app/views/application/app.html.erb index 71d29c6bb..39e70cf4c 100644 --- a/app/views/application/app.html.erb +++ b/app/views/application/app.html.erb @@ -1,5 +1,5 @@ - +
diff --git a/index.html b/index.html index 01ac2ef10..d08c83053 100644 --- a/index.html +++ b/index.html @@ -2,7 +2,7 @@ This file is strictly used for local development using the webpack-dev-server. --> - + diff --git a/package-lock.json b/package-lock.json index 723a81283..afdae7b35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11028,8 +11028,8 @@ "from": "github:standardnotes/sncrypto#8794c88daa967eaae493cd5fdec7506d52b257ad" }, "snjs": { - "version": "github:standardnotes/snjs#b7866c68243b418ae5e7be830d1593f0e07333e4", - "from": "github:standardnotes/snjs#b7866c68243b418ae5e7be830d1593f0e07333e4" + "version": "github:standardnotes/snjs#5757198630342821fdb0e8133b1597a39e0502ad", + "from": "github:standardnotes/snjs#5757198630342821fdb0e8133b1597a39e0502ad" }, "sockjs": { "version": "0.3.20", diff --git a/package.json b/package.json index 337d1cb8a..880d3c30a 100644 --- a/package.json +++ b/package.json @@ -72,6 +72,6 @@ "@bugsnag/js": "^7.5.1", "mobx": "^6.0.1", "sncrypto": "github:standardnotes/sncrypto#8794c88daa967eaae493cd5fdec7506d52b257ad", - "snjs": "github:standardnotes/snjs#b7866c68243b418ae5e7be830d1593f0e07333e4" + "snjs": "github:standardnotes/snjs#5757198630342821fdb0e8133b1597a39e0502ad" } }