@@ -9,7 +9,10 @@ import {
99 ENDPOINTS ,
1010 RouteConfig ,
1111 SHARED_PREF_UNKNOWN_USAGE_TRACKED ,
12- SHARED_PREFS_CRITERIA
12+ SHARED_PREFS_CRITERIA ,
13+ SHARED_PREF_CONSENT_TIMESTAMP ,
14+ SHARED_PREF_EMAIL ,
15+ SHARED_PREF_USER_ID
1316} from 'src/constants' ;
1417import {
1518 cancelAxiosRequestAndMakeFetch ,
@@ -116,6 +119,7 @@ const initializeUserId = (userId: string) => {
116119const addUserIdToRequest = ( userId : string ) => {
117120 setTypeOfAuth ( 'userID' ) ;
118121 authIdentifier = userId ;
122+ localStorage . setItem ( SHARED_PREF_USER_ID , userId ) ;
119123
120124 if ( typeof userInterceptor === 'number' ) {
121125 baseAxiosRequest . interceptors . request . eject ( userInterceptor ) ;
@@ -213,15 +217,30 @@ const initializeEmailUser = (email: string) => {
213217 clearUnknownUser ( ) ;
214218} ;
215219
216- const syncEvents = ( ) => {
217- if ( config . getConfig ( 'enableUnknownActivation' ) ) {
218- unknownUserManager . syncEvents ( ) ;
219- }
220- } ;
220+ const syncEvents = ( ) => {
221+ if ( config . getConfig ( 'enableUnknownActivation' ) ) {
222+ unknownUserManager . syncEvents ( ) ;
223+ }
224+ } ;
225+
226+ const handleConsentTracking = ( isUserKnown = false , isMergeOperation = false ) => {
227+ if ( config . getConfig ( 'enableUnknownActivation' ) ) {
228+ unknownUserManager . handleConsentTracking ( isUserKnown , isMergeOperation ) ;
229+ }
230+ } ;
231+
232+ const getIdentityResolutionBehavior = ( identityResolution ?: IdentityResolution ) => {
233+ const identityResolutionConfig = config . getConfig ( 'identityResolution' ) ;
234+ return {
235+ merge : identityResolution ?. mergeOnUnknownToKnown ?? identityResolutionConfig ?. mergeOnUnknownToKnown ,
236+ replay : identityResolution ?. replayOnVisitorToKnown ?? identityResolutionConfig ?. replayOnVisitorToKnown
237+ } ;
238+ } ;
221239
222240const addEmailToRequest = ( email : string ) => {
223241 setTypeOfAuth ( 'email' ) ;
224242 authIdentifier = email ;
243+ localStorage . setItem ( SHARED_PREF_EMAIL , email ) ;
225244
226245 if ( typeof userInterceptor === 'number' ) {
227246 baseAxiosRequest . interceptors . request . eject ( userInterceptor ) ;
@@ -415,7 +434,7 @@ export function initialize(
415434 emailOrUserId : string ,
416435 isEmail : boolean ,
417436 merge ?: boolean
418- ) : Promise < boolean > => {
437+ ) : Promise < { success : boolean ; mergePerformed : boolean } > => {
419438 const typeOfAuth = getTypeOfAuth ( ) ;
420439 const enableUnknownActivation = config . getConfig ( 'enableUnknownActivation' ) ;
421440 const sourceUserIdOrEmail =
@@ -438,11 +457,12 @@ export function initialize(
438457 destinationUserId ,
439458 destinationEmail
440459 ) ;
460+ return Promise . resolve ( { success : true , mergePerformed : true } ) ;
441461 } catch ( error ) {
442462 return Promise . reject ( `merging failed: ${ error } ` ) ;
443463 }
444464 }
445- return Promise . resolve ( true ) ; // promise resolves here because merging is not needed so we setUserID passed via dev
465+ return Promise . resolve ( { success : true , mergePerformed : false } ) ; // promise resolves here because merging is not needed so we setUserID passed via dev
446466 } ;
447467
448468 if ( ! generateJWT ) {
@@ -474,19 +494,13 @@ export function initialize(
474494 ) => {
475495 clearMessages ( ) ;
476496 try {
477- const identityResolutionConfig =
478- config . getConfig ( 'identityResolution' ) ;
479- const merge =
480- identityResolution ?. mergeOnUnknownToKnown ||
481- identityResolutionConfig ?. mergeOnUnknownToKnown ;
482- const replay =
483- identityResolution ?. replayOnVisitorToKnown ||
484- identityResolutionConfig ?. replayOnVisitorToKnown ;
497+ const { merge, replay } = getIdentityResolutionBehavior ( identityResolution ) ;
485498
486499 const result = await tryMergeUser ( email , true , merge ) ;
487- if ( result ) {
500+ if ( result . success ) {
488501 initializeEmailUser ( email ) ;
489502 if ( replay ) {
503+ await handleConsentTracking ( true , result . mergePerformed ) ;
490504 syncEvents ( ) ;
491505 } else {
492506 unknownUserManager . removeUnknownSessionCriteriaData ( ) ;
@@ -504,19 +518,13 @@ export function initialize(
504518 ) => {
505519 clearMessages ( ) ;
506520 try {
507- const identityResolutionConfig =
508- config . getConfig ( 'identityResolution' ) ;
509- const merge =
510- identityResolution ?. mergeOnUnknownToKnown ||
511- identityResolutionConfig ?. mergeOnUnknownToKnown ;
512- const replay =
513- identityResolution ?. replayOnVisitorToKnown ||
514- identityResolutionConfig ?. replayOnVisitorToKnown ;
521+ const { merge, replay } = getIdentityResolutionBehavior ( identityResolution ) ;
515522
516523 const result = await tryMergeUser ( userId , false , merge ) ;
517- if ( result ) {
524+ if ( result . success ) {
518525 initializeUserId ( userId ) ;
519526 if ( replay ) {
527+ await handleConsentTracking ( true , result . mergePerformed ) ;
520528 syncEvents ( ) ;
521529 } else {
522530 unknownUserManager . removeUnknownSessionCriteriaData ( ) ;
@@ -532,6 +540,8 @@ export function initialize(
532540 unknownUserManager . removeUnknownSessionCriteriaData ( ) ;
533541 setTypeOfAuth ( null ) ;
534542 authIdentifier = null ;
543+ localStorage . removeItem ( SHARED_PREF_EMAIL ) ;
544+ localStorage . removeItem ( SHARED_PREF_USER_ID ) ;
535545 /* clear fetched in-app messages */
536546 clearMessages ( ) ;
537547
@@ -555,6 +565,11 @@ export function initialize(
555565 localStorage . removeItem ( SHARED_PREFS_CRITERIA ) ;
556566
557567 localStorage . setItem ( SHARED_PREF_UNKNOWN_USAGE_TRACKED , 'true' ) ;
568+ // Store consent timestamp when user grants consent
569+ const existingConsent = localStorage . getItem ( SHARED_PREF_CONSENT_TIMESTAMP ) ;
570+ if ( ! existingConsent ) {
571+ localStorage . setItem ( SHARED_PREF_CONSENT_TIMESTAMP , Date . now ( ) . toString ( ) ) ;
572+ }
558573 enableUnknownTracking ( ) ;
559574 } else {
560575 /* if consent is false, we want to stop tracking and clear unknown user data */
@@ -565,6 +580,7 @@ export function initialize(
565580 localStorage . removeItem ( SHARED_PREFS_CRITERIA ) ;
566581 localStorage . removeItem ( SHARED_PREF_UNKNOWN_USER_ID ) ;
567582 localStorage . removeItem ( SHARED_PREF_UNKNOWN_USAGE_TRACKED ) ;
583+ localStorage . removeItem ( SHARED_PREF_CONSENT_TIMESTAMP ) ;
568584
569585 setTypeOfAuth ( null ) ;
570586 authIdentifier = null ;
@@ -858,21 +874,16 @@ export function initialize(
858874 /* clear previous user */
859875 clearMessages ( ) ;
860876 try {
861- const identityResolutionConfig = config . getConfig ( 'identityResolution' ) ;
862- const merge =
863- identityResolution ?. mergeOnUnknownToKnown ||
864- identityResolutionConfig ?. mergeOnUnknownToKnown ;
865- const replay =
866- identityResolution ?. replayOnVisitorToKnown ||
867- identityResolutionConfig ?. replayOnVisitorToKnown ;
877+ const { merge, replay } = getIdentityResolutionBehavior ( identityResolution ) ;
868878
869879 try {
870880 return doRequest ( { email } )
871881 . then ( async ( token ) => {
872882 const result = await tryMergeUser ( email , true , merge ) ;
873- if ( result ) {
883+ if ( result . success ) {
874884 initializeEmailUser ( email ) ;
875885 if ( replay ) {
886+ await handleConsentTracking ( true , result . mergePerformed ) ;
876887 syncEvents ( ) ;
877888 } else {
878889 unknownUserManager . removeUnknownSessionCriteriaData ( ) ;
@@ -903,21 +914,16 @@ export function initialize(
903914 ) => {
904915 clearMessages ( ) ;
905916 try {
906- const identityResolutionConfig = config . getConfig ( 'identityResolution' ) ;
907- const merge =
908- identityResolution ?. mergeOnUnknownToKnown ||
909- identityResolutionConfig ?. mergeOnUnknownToKnown ;
910- const replay =
911- identityResolution ?. replayOnVisitorToKnown ||
912- identityResolutionConfig ?. replayOnVisitorToKnown ;
917+ const { merge, replay } = getIdentityResolutionBehavior ( identityResolution ) ;
913918
914919 try {
915920 return doRequest ( { userID : userId } )
916921 . then ( async ( token ) => {
917922 const result = await tryMergeUser ( userId , false , merge ) ;
918- if ( result ) {
923+ if ( result . success ) {
919924 initializeUserId ( userId ) ;
920925 if ( replay ) {
926+ await handleConsentTracking ( true , result . mergePerformed ) ;
921927 syncEvents ( ) ;
922928 } else {
923929 unknownUserManager . removeUnknownSessionCriteriaData ( ) ;
@@ -946,6 +952,8 @@ export function initialize(
946952 unknownUserManager . removeUnknownSessionCriteriaData ( ) ;
947953 setTypeOfAuth ( null ) ;
948954 authIdentifier = null ;
955+ localStorage . removeItem ( SHARED_PREF_EMAIL ) ;
956+ localStorage . removeItem ( SHARED_PREF_USER_ID ) ;
949957 /* clear fetched in-app messages */
950958 clearMessages ( ) ;
951959
@@ -983,6 +991,11 @@ export function initialize(
983991 localStorage . removeItem ( SHARED_PREFS_CRITERIA ) ;
984992
985993 localStorage . setItem ( SHARED_PREF_UNKNOWN_USAGE_TRACKED , 'true' ) ;
994+ // Store consent timestamp when user grants consent
995+ const existingConsent = localStorage . getItem ( SHARED_PREF_CONSENT_TIMESTAMP ) ;
996+ if ( ! existingConsent ) {
997+ localStorage . setItem ( SHARED_PREF_CONSENT_TIMESTAMP , Date . now ( ) . toString ( ) ) ;
998+ }
986999 enableUnknownTracking ( ) ;
9871000 } else {
9881001 /* if consent is false, we want to stop tracking and clear unknown user data */
@@ -993,6 +1006,7 @@ export function initialize(
9931006 localStorage . removeItem ( SHARED_PREFS_CRITERIA ) ;
9941007 localStorage . removeItem ( SHARED_PREF_UNKNOWN_USER_ID ) ;
9951008 localStorage . removeItem ( SHARED_PREF_UNKNOWN_USAGE_TRACKED ) ;
1009+ localStorage . removeItem ( SHARED_PREF_CONSENT_TIMESTAMP ) ;
9961010
9971011 setTypeOfAuth ( null ) ;
9981012 authIdentifier = null ;
0 commit comments