Skip to content

Commit fd99e77

Browse files
authored
RF: Moved Analytics to class (#3222)
* RF: Moved Analytics to class * Modularisation of Google analytics. * Removing the code smells * Fix the unit tests * Simplified * Removed comment
1 parent 0007593 commit fd99e77

21 files changed

+279
-261
lines changed

src/js/Analytics.js

Lines changed: 183 additions & 177 deletions
Original file line numberDiff line numberDiff line change
@@ -1,180 +1,186 @@
1-
'use strict';
2-
3-
const Analytics = function (trackingId, userId, appName, appVersion, gitRevision, os, checkForDebugVersions, optOut, debugMode, buildType) {
4-
this._trackingId = trackingId;
5-
6-
this.setOptOut(optOut);
7-
8-
this._googleAnalytics = googleAnalytics;
9-
10-
this._googleAnalytics.initialize(this._trackingId, {
11-
storage: 'none',
12-
clientId: userId,
13-
debug: !!debugMode,
14-
});
15-
16-
// Make it work for the Chrome App:
17-
this._googleAnalytics.set('forceSSL', true);
18-
this._googleAnalytics.set('transport', 'xhr');
19-
20-
// Make it work for NW.js:
21-
this._googleAnalytics.set('checkProtocolTask', null);
22-
23-
this._googleAnalytics.set('appName', appName);
24-
this._googleAnalytics.set('appVersion', debugMode ? `${appVersion}-debug` : appVersion);
25-
26-
this.EVENT_CATEGORIES = {
27-
APPLICATION: 'Application',
28-
FLIGHT_CONTROLLER: 'FlightController',
29-
FLASHING: 'Flashing',
30-
};
31-
32-
this.DATA = {
33-
BOARD_TYPE: 'boardType',
34-
API_VERSION: 'apiVersion',
35-
FIRMWARE_TYPE: 'firmwareType',
36-
FIRMWARE_VERSION: 'firmwareVersion',
37-
FIRMWARE_NAME: 'firmwareName',
38-
FIRMWARE_SOURCE: 'firmwareSource',
39-
FIRMWARE_CHANNEL: 'firmwareChannel',
40-
FIRMWARE_ERASE_ALL: 'firmwareEraseAll',
41-
FIRMWARE_SIZE: 'firmwareSize',
42-
MCU_ID: 'mcuId',
43-
LOGGING_STATUS: 'loggingStatus',
44-
LOG_SIZE: 'logSize',
45-
TARGET_NAME: 'targetName',
46-
BOARD_NAME: 'boardName',
47-
MANUFACTURER_ID: 'manufacturerId',
48-
MCU_TYPE: 'mcuType',
49-
};
50-
51-
this.DIMENSIONS = {
52-
CONFIGURATOR_OS: 1,
53-
BOARD_TYPE: 2,
54-
FIRMWARE_TYPE: 3,
55-
FIRMWARE_VERSION: 4,
56-
API_VERSION: 5,
57-
FIRMWARE_NAME: 6,
58-
FIRMWARE_SOURCE: 7,
59-
FIRMWARE_ERASE_ALL: 8,
60-
CONFIGURATOR_EXPERT_MODE: 9,
61-
FIRMWARE_CHANNEL: 10,
62-
LOGGING_STATUS: 11,
63-
MCU_ID: 12,
64-
CONFIGURATOR_CHANGESET_ID: 13,
65-
CONFIGURATOR_USE_DEBUG_VERSIONS: 14,
66-
TARGET_NAME: 15,
67-
BOARD_NAME: 16,
68-
MANUFACTURER_ID: 17,
69-
MCU_TYPE: 18,
70-
CONFIGURATOR_BUILD_TYPE: 19,
71-
};
72-
73-
this.METRICS = {
74-
FIRMWARE_SIZE: 1,
75-
LOG_SIZE: 2,
76-
};
77-
78-
this.setDimension(this.DIMENSIONS.CONFIGURATOR_OS, os);
79-
this.setDimension(this.DIMENSIONS.CONFIGURATOR_CHANGESET_ID, gitRevision);
80-
this.setDimension(this.DIMENSIONS.CONFIGURATOR_USE_DEBUG_VERSIONS, checkForDebugVersions);
81-
this.setDimension(this.DIMENSIONS.CONFIGURATOR_BUILD_TYPE, buildType);
82-
83-
this.resetFlightControllerData();
84-
this.resetFirmwareData();
85-
};
86-
87-
Analytics.prototype.setDimension = function (dimension, value) {
88-
const dimensionName = `dimension${dimension}`;
89-
this._googleAnalytics.custom(dimensionName, value);
90-
};
91-
92-
Analytics.prototype.setMetric = function (metric, value) {
93-
const metricName = `metric${metric}`;
94-
this._googleAnalytics.custom(metricName, value);
95-
};
96-
97-
Analytics.prototype.sendEvent = function (category, action, options) {
98-
this._googleAnalytics.event(category, action, options);
99-
};
100-
101-
Analytics.prototype.sendChangeEvents = function (category, changeList) {
102-
for (const actionName in changeList) {
103-
if (changeList.hasOwnProperty(actionName)) {
104-
const actionValue = changeList[actionName];
105-
if (actionValue !== undefined) {
106-
this.sendEvent(category, actionName, { eventLabel: actionValue });
1+
2+
let tracking = null;
3+
export { tracking };
4+
5+
export function createAnalytics(ga, settings) {
6+
tracking = new Analytics(ga, settings);
7+
}
8+
9+
class Analytics {
10+
11+
constructor (ga, settings) {
12+
// trackingId, userId, appName, appVersion, gitRevision, os, checkForDebugVersions, optOut, debugMode, buildType
13+
this._trackingId = settings.trackingId;
14+
15+
this.setOptOut(settings.optOut);
16+
17+
this._googleAnalytics = ga;
18+
19+
this._googleAnalytics.initialize(this._trackingId, {
20+
storage: 'none',
21+
clientId: settings.userId,
22+
debug: !!settings.debugMode,
23+
});
24+
25+
// Make it work for the Chrome App:
26+
this._googleAnalytics.set('forceSSL', true);
27+
this._googleAnalytics.set('transport', 'xhr');
28+
29+
// Make it work for NW.js:
30+
this._googleAnalytics.set('checkProtocolTask', null);
31+
32+
this._googleAnalytics.set('appName', settings.appName);
33+
this._googleAnalytics.set('appVersion', settings.debugMode ? `${settings.appVersion}-debug` : settings.appVersion);
34+
35+
this.EVENT_CATEGORIES = {
36+
APPLICATION: 'Application',
37+
FLIGHT_CONTROLLER: 'FlightController',
38+
FLASHING: 'Flashing',
39+
};
40+
41+
this.DATA = {
42+
BOARD_TYPE: 'boardType',
43+
API_VERSION: 'apiVersion',
44+
FIRMWARE_TYPE: 'firmwareType',
45+
FIRMWARE_VERSION: 'firmwareVersion',
46+
FIRMWARE_NAME: 'firmwareName',
47+
FIRMWARE_SOURCE: 'firmwareSource',
48+
FIRMWARE_CHANNEL: 'firmwareChannel',
49+
FIRMWARE_ERASE_ALL: 'firmwareEraseAll',
50+
FIRMWARE_SIZE: 'firmwareSize',
51+
MCU_ID: 'mcuId',
52+
LOGGING_STATUS: 'loggingStatus',
53+
LOG_SIZE: 'logSize',
54+
TARGET_NAME: 'targetName',
55+
BOARD_NAME: 'boardName',
56+
MANUFACTURER_ID: 'manufacturerId',
57+
MCU_TYPE: 'mcuType',
58+
};
59+
60+
this.DIMENSIONS = {
61+
CONFIGURATOR_OS: 1,
62+
BOARD_TYPE: 2,
63+
FIRMWARE_TYPE: 3,
64+
FIRMWARE_VERSION: 4,
65+
API_VERSION: 5,
66+
FIRMWARE_NAME: 6,
67+
FIRMWARE_SOURCE: 7,
68+
FIRMWARE_ERASE_ALL: 8,
69+
CONFIGURATOR_EXPERT_MODE: 9,
70+
FIRMWARE_CHANNEL: 10,
71+
LOGGING_STATUS: 11,
72+
MCU_ID: 12,
73+
CONFIGURATOR_CHANGESET_ID: 13,
74+
CONFIGURATOR_USE_DEBUG_VERSIONS: 14,
75+
TARGET_NAME: 15,
76+
BOARD_NAME: 16,
77+
MANUFACTURER_ID: 17,
78+
MCU_TYPE: 18,
79+
CONFIGURATOR_BUILD_TYPE: 19,
80+
};
81+
82+
this.METRICS = {
83+
FIRMWARE_SIZE: 1,
84+
LOG_SIZE: 2,
85+
};
86+
87+
this.setDimension(this.DIMENSIONS.CONFIGURATOR_OS, settings.os);
88+
this.setDimension(this.DIMENSIONS.CONFIGURATOR_CHANGESET_ID, settings.gitRevision);
89+
this.setDimension(this.DIMENSIONS.CONFIGURATOR_USE_DEBUG_VERSIONS, settings.checkForDebugVersions);
90+
this.setDimension(this.DIMENSIONS.CONFIGURATOR_BUILD_TYPE, settings.buildType);
91+
92+
this.resetFlightControllerData();
93+
this.resetFirmwareData();
94+
}
95+
96+
setDimension(dimension, value) {
97+
const dimensionName = `dimension${dimension}`;
98+
this._googleAnalytics.custom(dimensionName, value);
99+
}
100+
101+
setMetric(metric, value) {
102+
const metricName = `metric${metric}`;
103+
this._googleAnalytics.custom(metricName, value);
104+
}
105+
106+
sendEvent(category, action, options) {
107+
this._googleAnalytics.event(category, action, options);
108+
}
109+
110+
sendChangeEvents(category, changeList) {
111+
for (const actionName in changeList) {
112+
if (changeList.hasOwnProperty(actionName)) {
113+
const actionValue = changeList[actionName];
114+
if (actionValue !== undefined) {
115+
this.sendEvent(category, actionName, { eventLabel: actionValue });
116+
}
107117
}
108118
}
109119
}
110-
};
111-
112-
Analytics.prototype.sendSaveAndChangeEvents = function (category, changeList, tabName) {
113-
this.sendEvent(category, 'Save', {
114-
eventLabel: tabName,
115-
eventValue: Object.keys(changeList).length,
116-
});
117-
this.sendChangeEvents(category, changeList);
118-
};
119-
120-
Analytics.prototype.sendAppView = function (viewName) {
121-
this._googleAnalytics.screenview(viewName);
122-
};
123-
124-
Analytics.prototype.sendTiming = function (category, timing, value) {
125-
this._googleAnalytics.timing(category, timing, value);
126-
};
127-
128-
Analytics.prototype.sendException = function (message) {
129-
this._googleAnalytics.exception(message);
130-
};
131-
132-
Analytics.prototype.setOptOut = function (optOut) {
133-
window[`ga-disable-${this._trackingId}`] = !!optOut;
134-
};
135-
136-
Analytics.prototype._rebuildFlightControllerEvent = function () {
137-
this.setDimension(this.DIMENSIONS.BOARD_TYPE, this._flightControllerData[this.DATA.BOARD_TYPE]);
138-
this.setDimension(this.DIMENSIONS.FIRMWARE_TYPE, this._flightControllerData[this.DATA.FIRMWARE_TYPE]);
139-
this.setDimension(this.DIMENSIONS.FIRMWARE_VERSION, this._flightControllerData[this.DATA.FIRMWARE_VERSION]);
140-
this.setDimension(this.DIMENSIONS.API_VERSION, this._flightControllerData[this.DATA.API_VERSION]);
141-
this.setDimension(this.DIMENSIONS.LOGGING_STATUS, this._flightControllerData[this.DATA.LOGGING_STATUS]);
142-
this.setDimension(this.DIMENSIONS.MCU_ID, this._flightControllerData[this.DATA.MCU_ID]);
143-
this.setMetric(this.METRICS.LOG_SIZE, this._flightControllerData[this.DATA.LOG_SIZE]);
144-
this.setDimension(this.DIMENSIONS.TARGET_NAME, this._flightControllerData[this.DATA.TARGET_NAME]);
145-
this.setDimension(this.DIMENSIONS.BOARD_NAME, this._flightControllerData[this.DATA.BOARD_NAME]);
146-
this.setDimension(this.DIMENSIONS.MANUFACTURER_ID, this._flightControllerData[this.DATA.MANUFACTURER_ID]);
147-
this.setDimension(this.DIMENSIONS.MCU_TYPE, this._flightControllerData[this.DATA.MCU_TYPE]);
148-
};
149-
150-
Analytics.prototype.setFlightControllerData = function (property, value) {
151-
this._flightControllerData[property] = value;
152-
153-
this._rebuildFlightControllerEvent();
154-
};
155-
156-
Analytics.prototype.resetFlightControllerData = function () {
157-
this._flightControllerData = {};
158-
159-
this._rebuildFlightControllerEvent();
160-
};
161-
162-
Analytics.prototype._rebuildFirmwareEvent = function () {
163-
this.setDimension(this.DIMENSIONS.FIRMWARE_NAME, this._firmwareData[this.DATA.FIRMWARE_NAME]);
164-
this.setDimension(this.DIMENSIONS.FIRMWARE_SOURCE, this._firmwareData[this.DATA.FIRMWARE_SOURCE]);
165-
this.setDimension(this.DIMENSIONS.FIRMWARE_ERASE_ALL, this._firmwareData[this.DATA.FIRMWARE_ERASE_ALL]);
166-
this.setDimension(this.DIMENSIONS.FIRMWARE_CHANNEL, this._firmwareData[this.DATA.FIRMWARE_CHANNEL]);
167-
this.setMetric(this.METRICS.FIRMWARE_SIZE, this._firmwareData[this.DATA.FIRMWARE_SIZE]);
168-
};
169-
170-
Analytics.prototype.setFirmwareData = function (property, value) {
171-
this._firmwareData[property] = value;
172-
173-
this._rebuildFirmwareEvent();
174-
};
175-
176-
Analytics.prototype.resetFirmwareData = function () {
177-
this._firmwareData = {};
178-
179-
this._rebuildFirmwareEvent();
180-
};
120+
121+
sendSaveAndChangeEvents(category, changeList, tabName) {
122+
this.sendEvent(category, 'Save', {
123+
eventLabel: tabName,
124+
eventValue: Object.keys(changeList).length,
125+
});
126+
this.sendChangeEvents(category, changeList);
127+
}
128+
129+
sendAppView(viewName) {
130+
this._googleAnalytics.screenview(viewName);
131+
}
132+
133+
sendTiming(category, timing, value) {
134+
this._googleAnalytics.timing(category, timing, value);
135+
}
136+
137+
sendException(message) {
138+
this._googleAnalytics.exception(message);
139+
}
140+
141+
setOptOut(optOut) {
142+
window[`ga-disable-${this._trackingId}`] = !!optOut;
143+
}
144+
145+
_rebuildFlightControllerEvent() {
146+
this.setDimension(this.DIMENSIONS.BOARD_TYPE, this._flightControllerData[this.DATA.BOARD_TYPE]);
147+
this.setDimension(this.DIMENSIONS.FIRMWARE_TYPE, this._flightControllerData[this.DATA.FIRMWARE_TYPE]);
148+
this.setDimension(this.DIMENSIONS.FIRMWARE_VERSION, this._flightControllerData[this.DATA.FIRMWARE_VERSION]);
149+
this.setDimension(this.DIMENSIONS.API_VERSION, this._flightControllerData[this.DATA.API_VERSION]);
150+
this.setDimension(this.DIMENSIONS.LOGGING_STATUS, this._flightControllerData[this.DATA.LOGGING_STATUS]);
151+
this.setDimension(this.DIMENSIONS.MCU_ID, this._flightControllerData[this.DATA.MCU_ID]);
152+
this.setMetric(this.METRICS.LOG_SIZE, this._flightControllerData[this.DATA.LOG_SIZE]);
153+
this.setDimension(this.DIMENSIONS.TARGET_NAME, this._flightControllerData[this.DATA.TARGET_NAME]);
154+
this.setDimension(this.DIMENSIONS.BOARD_NAME, this._flightControllerData[this.DATA.BOARD_NAME]);
155+
this.setDimension(this.DIMENSIONS.MANUFACTURER_ID, this._flightControllerData[this.DATA.MANUFACTURER_ID]);
156+
this.setDimension(this.DIMENSIONS.MCU_TYPE, this._flightControllerData[this.DATA.MCU_TYPE]);
157+
}
158+
159+
setFlightControllerData(property, value) {
160+
this._flightControllerData[property] = value;
161+
this._rebuildFlightControllerEvent();
162+
}
163+
164+
resetFlightControllerData() {
165+
this._flightControllerData = {};
166+
this._rebuildFlightControllerEvent();
167+
}
168+
169+
_rebuildFirmwareEvent() {
170+
this.setDimension(this.DIMENSIONS.FIRMWARE_NAME, this._firmwareData[this.DATA.FIRMWARE_NAME]);
171+
this.setDimension(this.DIMENSIONS.FIRMWARE_SOURCE, this._firmwareData[this.DATA.FIRMWARE_SOURCE]);
172+
this.setDimension(this.DIMENSIONS.FIRMWARE_ERASE_ALL, this._firmwareData[this.DATA.FIRMWARE_ERASE_ALL]);
173+
this.setDimension(this.DIMENSIONS.FIRMWARE_CHANNEL, this._firmwareData[this.DATA.FIRMWARE_CHANNEL]);
174+
this.setMetric(this.METRICS.FIRMWARE_SIZE, this._firmwareData[this.DATA.FIRMWARE_SIZE]);
175+
}
176+
177+
setFirmwareData(property, value) {
178+
this._firmwareData[property] = value;
179+
this._rebuildFirmwareEvent();
180+
}
181+
182+
resetFirmwareData() {
183+
this._firmwareData = {};
184+
this._rebuildFirmwareEvent();
185+
}
186+
}

src/js/CliAutoComplete.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ CliAutoComplete.setEnabled = function(enable) {
5151
};
5252

5353
CliAutoComplete.initialize = function($textarea, sendLine, writeToOutput) {
54-
analytics.sendEvent(analytics.EVENT_CATEGORIES.APPLICATION, 'CliAutoComplete', this.configEnabled);
54+
tracking.sendEvent(tracking.EVENT_CATEGORIES.APPLICATION, 'CliAutoComplete', this.configEnabled);
5555

5656
this.$textarea = $textarea;
5757
this.forceOpen = false;

src/js/Features.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ const Features = function (config) {
4646
Features.prototype.getMask = function () {
4747
const self = this;
4848

49-
analytics.sendChangeEvents(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, self._analyticsChanges);
49+
tracking.sendChangeEvents(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, self._analyticsChanges);
5050
self._analyticsChanges = {};
5151

5252
return self._featureMask;

src/js/backup_restore.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ function configuration_backup(callback) {
225225
return;
226226
}
227227

228-
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Backup');
228+
tracking.sendEvent(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Backup');
229229
console.log('Write SUCCESSFUL');
230230
if (callback) callback();
231231
};
@@ -308,7 +308,7 @@ function configuration_restore(callback) {
308308
configuration.FEATURE_CONFIG.features = features;
309309
}
310310

311-
analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Restore');
311+
tracking.sendEvent(tracking.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Restore');
312312

313313
configuration_upload(configuration, callback);
314314
} else {

0 commit comments

Comments
 (0)