diff --git a/CHANGES.md b/CHANGES.md index c0a3b731d19..46e402f8aff 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -84,6 +84,7 @@ Change Log * Provide a fallback name for an `ArcGisServerCatalogItem` * Ensure `CesiumTileLayer.getTileUrl` returns a string. * Adds methods `removeModelReferences` to Terria & ViewState for unregistering and removing models from different parts of the UI. +* Add basic support for various error provider services, implementing support for Rollbar. * Add trait to enabling hiding legends for a `CatalogMember` in the workbench. * Added new help menu item on how to navigate 3d data * Add traits to customize color blending and highlight color for `Cesium3DTilesCatalogItem` diff --git a/lib/Models/RollbarErrorProvider.ts b/lib/Models/RollbarErrorProvider.ts new file mode 100644 index 00000000000..82f1caaa821 --- /dev/null +++ b/lib/Models/RollbarErrorProvider.ts @@ -0,0 +1,29 @@ +import isDefined from "../Core/isDefined"; +import Terria from "./Terria"; +import Rollbar from "rollbar"; + +interface RollbarErrorProviderOptions { + terria: Terria; +} + +export default class RollbarErrorProvider { + terria: Terria; + errorProvider: any; + + constructor(options: RollbarErrorProviderOptions) { + this.terria = options.terria; + + if (!isDefined(this.terria.configParameters.rollbarAccessToken)) { + console.log( + "A rollbarAccessToken must be configured in the config.json to use the rollbar error provider" + ); + return; + } + this.errorProvider = new Rollbar({ + accessToken: this.terria.configParameters.rollbarAccessToken, + captureUncaught: true, + captureUnhandledRejections: true, + enabled: process.env.NODE_ENV === "production" + }); + } +} diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index 1304a117371..eb159bd4a8d 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -86,6 +86,7 @@ interface ConfigParameters { magdaReferenceHeaders?: MagdaReferenceHeaders; locationSearchBoundingBox?: number[]; googleAnalyticsKey?: string; + rollbarAccessToken?: string; } interface StartOptions { @@ -191,7 +192,8 @@ export default class Terria { experimentalFeatures: undefined, magdaReferenceHeaders: undefined, locationSearchBoundingBox: undefined, - googleAnalyticsKey: undefined + googleAnalyticsKey: undefined, + rollbarAccessToken: undefined }; @observable diff --git a/lib/ReactViewModels/ViewState.ts b/lib/ReactViewModels/ViewState.ts index a3da6319fc0..a5734435636 100644 --- a/lib/ReactViewModels/ViewState.ts +++ b/lib/ReactViewModels/ViewState.ts @@ -23,6 +23,7 @@ interface ViewStateOptions { terria: Terria; catalogSearchProvider: any; locationSearchProviders: any[]; + errorHandlingProvider?: any; } /** @@ -65,6 +66,8 @@ export default class ViewState { @observable workbenchWithOpenControls: string | undefined = undefined; + errorProvider: any | null = null; + // default value is null, because user has not made decision to show or // not show story // will be explicitly set to false when user 1. dismiss story @@ -128,6 +131,9 @@ export default class ViewState { locationSearchProviders: options.locationSearchProviders }); + this.errorProvider = options.errorHandlingProvider + ? options.errorHandlingProvider + : null; this.terria = terria; // Show errors to the user as notifications. diff --git a/package.json b/package.json index 7a2e5eb783b..d20248f35ed 100644 --- a/package.json +++ b/package.json @@ -119,6 +119,7 @@ "react-transition-group": "^4.3.0", "resolve-url-loader": "^3.0.1", "retry": "^0.12.0", + "rollbar": "^2.15.0", "sass-loader": "^7.1.0", "simple-statistics": "^7.0.1", "string-replace-loader": "^2.1.1", diff --git a/test/ReactViewModels/ViewStateSpec.ts b/test/ReactViewModels/ViewStateSpec.ts index b38679d7518..9fb5155d82a 100644 --- a/test/ReactViewModels/ViewStateSpec.ts +++ b/test/ReactViewModels/ViewStateSpec.ts @@ -1,5 +1,6 @@ import Terria from "../../lib/Models/Terria"; import ViewState from "../../lib/ReactViewModels/ViewState"; +import RollbarErrorProvider from "../../lib/Models/RollbarErrorProvider"; import SimpleCatalogItem from "../Helpers/SimpleCatalogItem"; describe("ViewState", function() { @@ -30,4 +31,19 @@ describe("ViewState", function() { expect(viewState.userDataPreviewedItem).toBeUndefined(); }); }); + + describe("error provider", function() { + it("creates an empty error provider by default", function() { + expect(viewState.errorProvider).toBeNull(); + }); + + it("can create an error provider with rollbar", function() { + terria.configParameters.rollbarAccessToken = "123"; + viewState.errorProvider = new RollbarErrorProvider({ + terria: viewState.terria + }); + expect(viewState.errorProvider).toBeDefined(); + expect(viewState.errorProvider.errorProvider).toBeDefined(); + }); + }); });