initial piwik stuff

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
This commit is contained in:
Michael Telatynski 2017-05-27 20:47:09 +01:00
parent 5a6baafc91
commit 98c2f9201b
4 changed files with 84 additions and 1 deletions

77
src/Analytics.js Normal file
View file

@ -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/<redacted>");
}
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;

View file

@ -19,6 +19,7 @@ import q from 'q';
import Matrix from 'matrix-js-sdk'; import Matrix from 'matrix-js-sdk';
import MatrixClientPeg from './MatrixClientPeg'; import MatrixClientPeg from './MatrixClientPeg';
import Analytics from './Analytics';
import Notifier from './Notifier'; import Notifier from './Notifier';
import UserActivity from './UserActivity'; import UserActivity from './UserActivity';
import Presence from './Presence'; import Presence from './Presence';
@ -405,6 +406,7 @@ export function onLoggedOut() {
} }
function _clearLocalStorage() { function _clearLocalStorage() {
Analytics.logout();
if (!window.localStorage) { if (!window.localStorage) {
return; return;
} }

View file

@ -20,6 +20,7 @@ import q from 'q';
import React from 'react'; import React from 'react';
import Matrix from "matrix-js-sdk"; import Matrix from "matrix-js-sdk";
import Analytics from "../../Analytics";
import MatrixClientPeg from "../../MatrixClientPeg"; import MatrixClientPeg from "../../MatrixClientPeg";
import PlatformPeg from "../../PlatformPeg"; import PlatformPeg from "../../PlatformPeg";
import SdkConfig from "../../SdkConfig"; import SdkConfig from "../../SdkConfig";
@ -1004,6 +1005,7 @@ module.exports = React.createClass({
if (this.props.onNewScreen) { if (this.props.onNewScreen) {
this.props.onNewScreen(screen); this.props.onNewScreen(screen);
} }
Analytics.trackPageChange();
}, },
onAliasClick: function(event, alias) { onAliasClick: function(event, alias) {

View file

@ -16,6 +16,7 @@ limitations under the License.
import React from 'react'; import React from 'react';
import Analytics from '../../../Analytics';
import * as KeyCode from '../../../KeyCode'; import * as KeyCode from '../../../KeyCode';
import AccessibleButton from '../elements/AccessibleButton'; import AccessibleButton from '../elements/AccessibleButton';
import sdk from '../../../index'; import sdk from '../../../index';
@ -66,8 +67,9 @@ export default React.createClass({
}, },
render: function() { render: function() {
Analytics.trackEvent('Dialog', 'mount', this.props.title);
const TintableSvg = sdk.getComponent("elements.TintableSvg"); const TintableSvg = sdk.getComponent("elements.TintableSvg");
return ( return (
<div onKeyDown={this._onKeyDown} className={this.props.className}> <div onKeyDown={this._onKeyDown} className={this.props.className}>
<AccessibleButton onClick={this._onCancelClick} <AccessibleButton onClick={this._onCancelClick}