Skip to content

Commit 43270aa

Browse files
committed
refactor: isPowerUser APi to metrics from health extension
1 parent f627f05 commit 43270aa

File tree

3 files changed

+58
-29
lines changed

3 files changed

+58
-29
lines changed

src/extensions/default/HealthData/HealthDataManager.js

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,29 @@ define(function (require, exports, module) {
3636
TEN_SECOND = 10 * ONE_SECOND,
3737
ONE_MINUTE = 60000,
3838
MAX_DAYS_TO_KEEP_COUNTS = 60,
39-
// 'healthDataUsage' key is used in other places tho private to phoenix. search for other usage before rename
4039
USAGE_COUNTS_KEY = "healthDataUsage";
4140

41+
/**
42+
* A power user is someone who has used Phoenix at least 3 days or 8 hours in the last two weeks
43+
* @returns {boolean}
44+
*/
45+
function isPowerUser() {
46+
let usageData = PreferencesManager.getViewState(USAGE_COUNTS_KEY) || {},
47+
dateKeys = Object.keys(usageData),
48+
dateBefore14Days = new Date(),
49+
totalUsageMinutes = 0,
50+
totalUsageDays = 0;
51+
dateBefore14Days.setUTCDate(dateBefore14Days.getUTCDate()-14);
52+
for(let dateKey of dateKeys){
53+
let date = new Date(dateKey);
54+
if(date >= dateBefore14Days) {
55+
totalUsageDays ++;
56+
totalUsageMinutes = totalUsageMinutes + usageData[dateKey];
57+
}
58+
}
59+
return totalUsageDays >= 3 || (totalUsageMinutes/60) >= 8;
60+
}
61+
4262
let healthDataDisabled;
4363

4464
prefs.definePreference("healthDataTracking", "boolean", true, {
@@ -85,7 +105,9 @@ define(function (require, exports, module) {
85105
}
86106

87107
AppInit.appReady(function () {
88-
Metrics.init();
108+
Metrics.init({
109+
isPowerUserFn: isPowerUser
110+
});
89111
healthDataDisabled = !prefs.get("healthDataTracking");
90112
Metrics.setDisabled(healthDataDisabled);
91113
SendToAnalytics.sendPlatformMetrics();

src/extensionsIntegrated/Phoenix/guided-tour.js

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ define(function (require, exports, module) {
2828
Metrics = require("utils/Metrics"),
2929
Dialogs = require("widgets/Dialogs"),
3030
Mustache = require("thirdparty/mustache/mustache"),
31-
PreferencesManager = require("preferences/PreferencesManager"),
3231
SurveyTemplate = require("text!./html/survey-template.html"),
3332
NOTIFICATION_BACKOFF = 10000,
3433
GUIDED_TOUR_LOCAL_STORAGE_KEY = "guidedTourActions";
@@ -41,8 +40,7 @@ define(function (require, exports, module) {
4140
POWER_USER_SURVEY_TIME = 10000, // 10 seconds to allow the survey to preload, but not
4241
// enough time to break user workflow
4342
ONE_MONTH_IN_DAYS = 30,
44-
POWER_USER_SURVEY_INTERVAL_DAYS = 35,
45-
USAGE_COUNTS_KEY = "healthDataUsage"; // private to phoenix, set from health data extension
43+
POWER_USER_SURVEY_INTERVAL_DAYS = 35;
4644

4745
const userAlreadyDidAction = PhStore.getItem(GUIDED_TOUR_LOCAL_STORAGE_KEY)
4846
? JSON.parse(PhStore.getItem(GUIDED_TOUR_LOCAL_STORAGE_KEY)) : {
@@ -240,24 +238,6 @@ define(function (require, exports, module) {
240238
}, delayOverride || GENERAL_SURVEY_TIME);
241239
}
242240

243-
// a power user is someone who has used Phoenix at least 3 days or 8 hours in the last two weeks
244-
function _isPowerUser() {
245-
let usageData = PreferencesManager.getViewState(USAGE_COUNTS_KEY) || {},
246-
dateKeys = Object.keys(usageData),
247-
dateBefore14Days = new Date(),
248-
totalUsageMinutes = 0,
249-
totalUsageDays = 0;
250-
dateBefore14Days.setUTCDate(dateBefore14Days.getUTCDate()-14);
251-
for(let dateKey of dateKeys){
252-
let date = new Date(dateKey);
253-
if(date >= dateBefore14Days) {
254-
totalUsageDays ++;
255-
totalUsageMinutes = totalUsageMinutes + usageData[dateKey];
256-
}
257-
}
258-
return totalUsageDays >= 3 || (totalUsageMinutes/60) >= 8;
259-
}
260-
261241
function addSurveyIframe(surveyURL) {
262242
const $surveyFrame = $('<iframe>', {
263243
src: surveyURL,
@@ -296,7 +276,7 @@ define(function (require, exports, module) {
296276
}
297277

298278
function _showPowerUserSurvey(surveyURL, intervalOverride) {
299-
if(_isPowerUser()) {
279+
if(Metrics.isPowerUser()) {
300280
const intervalDays = intervalOverride || POWER_USER_SURVEY_INTERVAL_DAYS;
301281
Metrics.countEvent(Metrics.EVENT_TYPE.USER, "power", "user", 1);
302282
let lastShownDate = userAlreadyDidAction.lastShownPowerSurveyDate;

src/utils/Metrics.js

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ define(function (require, exports, module) {
4646
loggedDataForAudit = new Map();
4747

4848
let isFirstUseDay;
49-
let userID;
49+
let userID, isPowerUserFn;
50+
let cachedIsPowerUser = false;
5051

5152
function _setUserID() {
5253
const userIDKey = "phoenixUserPseudoID";
@@ -70,9 +71,11 @@ define(function (require, exports, module) {
7071
dayAfterFirstUse.setUTCDate(firstUseDay.getUTCDate() + 1);
7172
let today = new Date();
7273
isFirstUseDay = today < dayAfterFirstUse;
74+
if(!isFirstUseDay){
75+
setTimeout(_setFirstDayFlag, ONE_DAY);
76+
}
7377
}
7478
_setFirstDayFlag();
75-
setInterval(_setFirstDayFlag, ONE_DAY);
7679

7780
/**
7881
* This section outlines the properties and methods available in this module
@@ -260,13 +263,20 @@ define(function (require, exports, module) {
260263
* and paid plans for GA starts at 100,000 USD.
261264
* @private
262265
*/
263-
function init(){
266+
function init(initOptions = {}){
264267
if(initDone || window.testEnvironment){
265268
return;
266269
}
267270
_initGoogleAnalytics();
268271
_initCoreAnalytics();
269272
initDone = true;
273+
if (initOptions.isPowerUserFn) {
274+
isPowerUserFn = initOptions.isPowerUserFn;
275+
cachedIsPowerUser = isPowerUserFn(); // only call once to avoid heavy computations repeatedly
276+
setInterval(()=>{
277+
cachedIsPowerUser = isPowerUserFn();
278+
}, ONE_DAY);
279+
}
270280
}
271281

272282
// some events generate too many ga events that ga can't handle. ignore them.
@@ -351,7 +361,10 @@ define(function (require, exports, module) {
351361
* @type {function}
352362
*/
353363
function countEvent(eventType, eventCategory, eventSubCategory, count= 1) {
354-
if(!isFirstUseDay){
364+
if(cachedIsPowerUser){
365+
// emit power user metrics too
366+
_countEvent(`P-${eventType}`, eventCategory, eventSubCategory, count);
367+
} else if(!isFirstUseDay){
355368
// emit repeat user metrics too
356369
_countEvent(`R-${eventType}`, eventCategory, eventSubCategory, count);
357370
}
@@ -379,7 +392,10 @@ define(function (require, exports, module) {
379392
* @type {function}
380393
*/
381394
function valueEvent(eventType, eventCategory, eventSubCategory, value) {
382-
if(!isFirstUseDay){
395+
if(cachedIsPowerUser){
396+
// emit power user metrics too
397+
_valueEvent(`P-${eventType}`, eventCategory, eventSubCategory, value);
398+
} else if(!isFirstUseDay){
383399
// emit repeat user metrics too
384400
_valueEvent(`R-${eventType}`, eventCategory, eventSubCategory, value);
385401
}
@@ -452,6 +468,16 @@ define(function (require, exports, module) {
452468
return "10000+";
453469
}
454470

471+
/**
472+
* A power user is someone who has used Phoenix at least 3 days or 8 hours in the last two weeks
473+
* @returns {boolean}
474+
*/
475+
function isPowerUser() {
476+
if(!isPowerUserFn) {
477+
throw new Error("PowerUser fn is not initialized in Metrics.");
478+
}
479+
return isPowerUserFn();
480+
}
455481

456482
// Define public API
457483
exports.init = init;
@@ -464,6 +490,7 @@ define(function (require, exports, module) {
464490
exports.logPerformanceTime = logPerformanceTime;
465491
exports.flushMetrics = flushMetrics;
466492
exports.getRangeName = getRangeName;
493+
exports.isPowerUser = isPowerUser;
467494
exports.EVENT_TYPE = EVENT_TYPE;
468495
exports.AUDIT_TYPE_COUNT = AUDIT_TYPE_COUNT;
469496
exports.AUDIT_TYPE_VALUE = AUDIT_TYPE_VALUE;

0 commit comments

Comments
 (0)