diff --git a/src/Analytics.js b/src/Analytics.js new file mode 100644 index 0000000000..eccbecc304 --- /dev/null +++ b/src/Analytics.js @@ -0,0 +1,77 @@ +/* + Copyright 2017 Michael Telatynski <7t3chguy@gmail.com> + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +/* + * Holds the current Platform object used by the code to do anything + * specific to the platform we're running on (eg. web, electron) + * Platforms are provided by the app layer. + * This allows the app layer to set a Platform without necessarily + * having to have a MatrixChat object + */ + +import MatrixClientPeg from './MatrixClientPeg'; +// import dis from './dispatcher'; + +function redact(str) { + return str.replace(/#\/(room|user)\/(.+)/, "#/$1/"); +} + +class Analytics { + constructor() { + this.tracker = null; + } + + set(tracker) { + this.tracker = tracker; + + this.tracker.enableHeartBeatTimer(); + this.tracker.enableLinkTracking(true); + + // dis.register(this._onAction.bind(this)); + } + + // _onAction(payload) { + // this.trackEvent('Dispatcher', payload.action); + // } + + async trackPageChange() { + if (!this.tracker) return; + this.tracker.trackPageView(redact(window.location.hash)); + } + + async trackEvent(category, action, name) { + if (!this.tracker) return; + this.tracker.trackEvent(category, action, name); + } + + async logout() { + if (!this.tracker) return; + this.tracker.deleteCookies(); + } + + async login() { // not used currently + const cli = MatrixClientPeg.get(); + if (!this.tracker || !cli) return; + + this.tracker.setUserId(`@${cli.getUserIdLocalpart()}:${cli.getDomain()}`); + } + +} + +if (!global.mxAnalytics) { + global.mxAnalytics = new Analytics(); +} +module.exports = global.mxAnalytics; diff --git a/src/Lifecycle.js b/src/Lifecycle.js index 0e3e52fe40..951f00d270 100644 --- a/src/Lifecycle.js +++ b/src/Lifecycle.js @@ -19,6 +19,7 @@ import q from 'q'; import Matrix from 'matrix-js-sdk'; import MatrixClientPeg from './MatrixClientPeg'; +import Analytics from './Analytics'; import Notifier from './Notifier'; import UserActivity from './UserActivity'; import Presence from './Presence'; @@ -405,6 +406,7 @@ export function onLoggedOut() { } function _clearLocalStorage() { + Analytics.logout(); if (!window.localStorage) { return; } diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 2ba1506551..625ff26604 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -20,6 +20,7 @@ import q from 'q'; import React from 'react'; import Matrix from "matrix-js-sdk"; +import Analytics from "../../Analytics"; import MatrixClientPeg from "../../MatrixClientPeg"; import PlatformPeg from "../../PlatformPeg"; import SdkConfig from "../../SdkConfig"; @@ -1004,6 +1005,7 @@ module.exports = React.createClass({ if (this.props.onNewScreen) { this.props.onNewScreen(screen); } + Analytics.trackPageChange(); }, onAliasClick: function(event, alias) { diff --git a/src/components/views/dialogs/BaseDialog.js b/src/components/views/dialogs/BaseDialog.js index 0b2ca5225d..8c3e9d687c 100644 --- a/src/components/views/dialogs/BaseDialog.js +++ b/src/components/views/dialogs/BaseDialog.js @@ -16,6 +16,7 @@ limitations under the License. import React from 'react'; +import Analytics from '../../../Analytics'; import * as KeyCode from '../../../KeyCode'; import AccessibleButton from '../elements/AccessibleButton'; import sdk from '../../../index'; @@ -66,8 +67,9 @@ export default React.createClass({ }, render: function() { + Analytics.trackEvent('Dialog', 'mount', this.props.title); const TintableSvg = sdk.getComponent("elements.TintableSvg"); - + return (