@@ -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