@schibsted/pulse-sdk 8.0.0-rc.5 → 8.0.0-rc.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/Tracker.js +137 -119
- package/dist/cjs/leaveTrackingTpaas/constants.js +2 -7
- package/dist/cjs/leaveTrackingTpaas/index.js +52 -40
- package/dist/cjs/tracker-proxy/consts.js +3 -0
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/visibility-observer/index.js +9 -7
- package/dist/cjs/wrapper/types/event.js +5 -0
- package/dist/ejs/Tracker.js +138 -120
- package/dist/ejs/leaveTrackingTpaas/constants.js +1 -5
- package/dist/ejs/leaveTrackingTpaas/index.js +53 -41
- package/dist/ejs/tracker-proxy/consts.js +3 -0
- package/dist/ejs/version.js +1 -1
- package/dist/ejs/visibility-observer/index.js +9 -7
- package/dist/ejs/wrapper/types/event.js +4 -1
- package/dist/types/Tracker.d.ts +55 -20
- package/dist/types/index.d.ts +1 -1
- package/dist/types/leaveTrackingTpaas/constants.d.ts +1 -5
- package/dist/types/leaveTrackingTpaas/index.d.ts +6 -6
- package/dist/types/leaveTrackingTpaas/types.d.ts +1 -9
- package/dist/types/tracker-proxy/consts.d.ts +1 -1
- package/dist/types/types.d.ts +19 -13
- package/dist/types/version.d.ts +1 -1
- package/dist/types/visibility-observer/index.d.ts +6 -1
- package/dist/types/wrapper/types/event.d.ts +3 -1
- package/node_modules/@schibsted/pulse-utils/package.json +1 -1
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders.js +5 -1
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/guards.js +7 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/index.js +3 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders.js +5 -2
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/guards.js +4 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/index.js +1 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/index.d.ts +792 -166
- package/node_modules/@schibsted/tpaas-event-builder/package.json +1 -1
- package/node_modules/@schibsted/tpaas-schemas/dist/cjs/constants.js +66 -57
- package/node_modules/@schibsted/tpaas-schemas/dist/ejs/constants.js +64 -55
- package/node_modules/@schibsted/tpaas-schemas/dist/index.d.ts +836 -219
- package/package.json +4 -4
package/dist/ejs/Tracker.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { parsePulseCookies } from '@schibsted/pulse-cis-sync';
|
|
2
2
|
import { evaluateAndFlatten, isBrowser, isFunction, isPromise, isString, pulseMerge, throttle, } from '@schibsted/pulse-utils';
|
|
3
|
-
import { buildAnonymousViewUIElementEvent, buildCompletedHealthActionEvent, buildEngagementAudioEvent, buildEngagementFormEvent, buildEngagementHealthUIElementEvent, buildEngagementOfferEvent, buildEngagementTeaserEvent, buildEngagementUIElementEvent, buildEngagementVideoAdEvent, buildEngagementVideoEvent, buildEngagementWidgetEvent, buildImpressionFormEvent, buildImpressionHealthUIElementEvent, buildImpressionOfferEvent, buildImpressionPlayerEvent, buildImpressionTeaserEvent, buildImpressionUIElementEvent, buildImpressionWidgetEvent, buildLeaveArticleEvent, buildLeaveAudioPageEvent, buildLeaveErrorEvent, buildLeaveFrontpageEvent, buildLeaveLandingpageEvent, buildLeaveListingEvent, buildLeaveLockedArticleEvent, buildLeaveLockedAudioPageEvent, buildLeaveLockedVideoPageEvent, buildLeavePageEvent, buildLeaveSportsPageEvent, buildLeaveVideoPageEvent, buildLeaveWeatherEvent, buildViewArticleEvent, buildViewAudioPageEvent, buildViewErrorEvent, buildViewFrontpageEvent, buildViewHealthPageEvent, buildViewLandingpageEvent, buildViewListingEvent, buildViewLockedArticleEvent, buildViewLockedAudioPageEvent, buildViewLockedVideoPageEvent, buildViewPageEvent, buildViewSportsPageEvent, buildViewTitleEvent, buildViewVideoPageEvent, buildViewWeatherEvent, getCommonBuildersOutput, } from '@schibsted/tpaas-event-builder';
|
|
3
|
+
import { buildAnonymousViewUIElementEvent, buildCompletedHealthActionEvent, buildEngagementAudioEvent, buildEngagementFormEvent, buildEngagementHealthUIElementEvent, buildEngagementOfferEvent, buildEngagementTeaserEvent, buildEngagementUIElementEvent, buildEngagementVideoAdEvent, buildEngagementVideoEvent, buildEngagementWidgetEvent, buildImpressionAdSlotEvent, buildImpressionFormEvent, buildImpressionHealthUIElementEvent, buildImpressionOfferEvent, buildImpressionPlayerEvent, buildImpressionTeaserEvent, buildImpressionUIElementEvent, buildImpressionWidgetEvent, buildLeaveArticleEvent, buildLeaveAudioPageEvent, buildLeaveErrorEvent, buildLeaveFrontpageEvent, buildLeaveLandingpageEvent, buildLeaveListingEvent, buildLeaveLockedArticleEvent, buildLeaveLockedAudioPageEvent, buildLeaveLockedVideoPageEvent, buildLeavePageEvent, buildLeaveSportsPageEvent, buildLeaveVideoPageEvent, buildLeaveWeatherEvent, buildViewArticleEvent, buildViewAudioPageEvent, buildViewErrorEvent, buildViewFrontpageEvent, buildViewHealthPageEvent, buildViewLandingpageEvent, buildViewListingEvent, buildViewLockedArticleEvent, buildViewLockedAudioPageEvent, buildViewLockedVideoPageEvent, buildViewPageEvent, buildViewSportsPageEvent, buildViewTitleEvent, buildViewVideoPageEvent, buildViewWeatherEvent, getCommonBuildersOutput, isPageType, } from '@schibsted/tpaas-event-builder';
|
|
4
4
|
import { LeaveArticle, LeaveAudioPage, LeaveError, LeaveFrontpage, LeaveLandingpage, LeaveListing, LeaveLockedArticle, LeaveLockedAudioPage, LeaveLockedVideoPage, LeavePage, LeaveSportsPage, LeaveVideoPage, LeaveWeather, ViewArticle, ViewAudioPage, ViewError, ViewFrontpage, ViewHealthPage, ViewLandingpage, ViewListing, ViewLockedArticle, ViewLockedAudioPage, ViewLockedVideoPage, ViewPage, ViewSportsPage, ViewTitle, ViewVideoPage, ViewWeather, } from '@schibsted/tpaas-schemas';
|
|
5
5
|
import logger from 'loglevel';
|
|
6
6
|
import { v4 } from 'uuid';
|
|
@@ -25,6 +25,7 @@ import { SDK_VERSION } from './version';
|
|
|
25
25
|
import { VisibilityObserver } from './visibility-observer';
|
|
26
26
|
import warnOnce from './warnOnce';
|
|
27
27
|
import { buildClickUIElementEvent } from './wrapper/engagement/ui-element/event-builder';
|
|
28
|
+
import { isLegacyPageType } from './wrapper/types';
|
|
28
29
|
import { pageFromPageView } from './wrapper/utils/page-from-page-view';
|
|
29
30
|
import { buildLegacyViewArticleEvent } from './wrapper/view/article/event-builder';
|
|
30
31
|
import { buildLegacyViewFrontpageEvent } from './wrapper/view/frontpage/event-builder';
|
|
@@ -114,6 +115,27 @@ export function unsubscribe(eventName, callback) {
|
|
|
114
115
|
* @class Tracker
|
|
115
116
|
*/
|
|
116
117
|
export default class Tracker {
|
|
118
|
+
async getCurrentTpaasPage() {
|
|
119
|
+
const { id, type, url } = await this.currentPage;
|
|
120
|
+
return {
|
|
121
|
+
// remove the SDRN prefix, it's not expected for TPaaS
|
|
122
|
+
pageId: id.startsWith('sdrn:') ? id.split(':').slice(-1)[0] : id,
|
|
123
|
+
// make sure the pageType is valid for TPaaS
|
|
124
|
+
pageType: isPageType(type) ? type : 'Page',
|
|
125
|
+
url,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
async getCurrentLegacyPage() {
|
|
129
|
+
const { id, type, url } = await this.currentPage;
|
|
130
|
+
// make sure the pageType is valid for legacy events
|
|
131
|
+
const validatedType = isLegacyPageType(type) ? type : 'Page';
|
|
132
|
+
return {
|
|
133
|
+
// add the SDRN prefix if it's not there, legacy events expect the full SDRN format
|
|
134
|
+
id: id.startsWith('sdrn:') ? id : `sdrn:${this.state.providerId}:${validatedType.toLowerCase()}:${id}`,
|
|
135
|
+
type: validatedType,
|
|
136
|
+
url,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
117
139
|
/**
|
|
118
140
|
* > [!WARNING]
|
|
119
141
|
* >
|
|
@@ -132,12 +154,18 @@ export default class Tracker {
|
|
|
132
154
|
// the tracking of the same element with both old and new events at the same time
|
|
133
155
|
this.legacyVisibilityObservers = new Map();
|
|
134
156
|
this.visibilityObservers = new Map();
|
|
135
|
-
|
|
136
|
-
|
|
157
|
+
/**
|
|
158
|
+
* @private
|
|
159
|
+
*
|
|
160
|
+
* This is used as the source of truth for the current page's information, which is updated based on the View Page-level event
|
|
161
|
+
* As a single source of truth for the current page, this needs to be compatible between legacy and TPaaS events, hence the need for a custom data type.
|
|
162
|
+
* Legacy events can provide an id with SDRN, while TPaaS events don't need it
|
|
163
|
+
*/
|
|
164
|
+
this.currentPage = {
|
|
165
|
+
id: 'unknown',
|
|
137
166
|
type: 'Page',
|
|
138
|
-
url:
|
|
167
|
+
url: isBrowser ? window.location.href : undefined,
|
|
139
168
|
};
|
|
140
|
-
this.currentPage = undefined;
|
|
141
169
|
/**
|
|
142
170
|
* Promise that resolves when a session ID becomes available
|
|
143
171
|
* @private
|
|
@@ -149,7 +177,7 @@ export default class Tracker {
|
|
|
149
177
|
*/
|
|
150
178
|
this.hasProxyListener = false;
|
|
151
179
|
this.setPageDefaults = (pageViewEvent) => {
|
|
152
|
-
this.
|
|
180
|
+
this.currentPage = pageFromPageView(pageViewEvent);
|
|
153
181
|
if (pageViewEvent.origin) {
|
|
154
182
|
const pageDefaults = { origin: pageViewEvent.origin };
|
|
155
183
|
this.update(pageDefaults, true);
|
|
@@ -157,8 +185,8 @@ export default class Tracker {
|
|
|
157
185
|
};
|
|
158
186
|
this.setCurrentPage = (id, type) => {
|
|
159
187
|
this.currentPage = {
|
|
160
|
-
|
|
161
|
-
|
|
188
|
+
id: id || 'unknown',
|
|
189
|
+
type: type || 'Page',
|
|
162
190
|
url: isBrowser ? window.location.href : undefined,
|
|
163
191
|
};
|
|
164
192
|
};
|
|
@@ -428,7 +456,6 @@ export default class Tracker {
|
|
|
428
456
|
};
|
|
429
457
|
}
|
|
430
458
|
/**
|
|
431
|
-
*
|
|
432
459
|
* @private
|
|
433
460
|
* @category TPaaS Tracking
|
|
434
461
|
*/
|
|
@@ -488,10 +515,11 @@ export default class Tracker {
|
|
|
488
515
|
source: source || 'unknown',
|
|
489
516
|
};
|
|
490
517
|
}
|
|
491
|
-
const [actor, consents, experiments] = await Promise.all([
|
|
518
|
+
const [actor, consents, experiments, currentPage] = await Promise.all([
|
|
492
519
|
this.getActor(),
|
|
493
520
|
this.getConsents(),
|
|
494
521
|
this.adaptExperiments(this.builders.experiments),
|
|
522
|
+
this.getCurrentTpaasPage(),
|
|
495
523
|
]);
|
|
496
524
|
const { environmentId, jwe } = parsePulseCookies();
|
|
497
525
|
return {
|
|
@@ -502,7 +530,7 @@ export default class Tracker {
|
|
|
502
530
|
consents: adaptConsentsToNewFormat(consents),
|
|
503
531
|
providerId: this.state.providerId,
|
|
504
532
|
pageviewId: this.state.pageViewId,
|
|
505
|
-
currentPage
|
|
533
|
+
currentPage,
|
|
506
534
|
experiments,
|
|
507
535
|
environmentId,
|
|
508
536
|
jwe,
|
|
@@ -579,7 +607,7 @@ export default class Tracker {
|
|
|
579
607
|
const viewUIElementInputProperties = buildEventFromElement(element);
|
|
580
608
|
this.trackLegacyViewUIElement(viewUIElementInputProperties);
|
|
581
609
|
}));
|
|
582
|
-
this.legacyVisibilityObservers.get(selector)?.observe(selector);
|
|
610
|
+
this.legacyVisibilityObservers.get(selector)?.observe(selector, {});
|
|
583
611
|
}
|
|
584
612
|
/**
|
|
585
613
|
* The `addUIElementVisibilityTracking` function provides an interface for sending tracking events when specific UI elements become visible within the viewport.
|
|
@@ -611,7 +639,38 @@ export default class Tracker {
|
|
|
611
639
|
const eventInput = buildEventFromElement(element);
|
|
612
640
|
this.trackImpressionUIElement(eventInput);
|
|
613
641
|
}));
|
|
614
|
-
this.visibilityObservers.get(selector)?.observe(selector);
|
|
642
|
+
this.visibilityObservers.get(selector)?.observe(selector, {});
|
|
643
|
+
}
|
|
644
|
+
/**
|
|
645
|
+
* The `addElementVisibilityObserver` function provides an interface for executing arbitrary code when specific DOM Elements become visible within the viewport.
|
|
646
|
+
* It is built on the `VisibilityObserver` class, which efficiently detects visibility changes in DOM elements.
|
|
647
|
+
* When an element becomes at least 2/3 visible, a callback is triggered, with the Element that invoked the callback call as argument.
|
|
648
|
+
* It leverages the [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API) for viewport tracking
|
|
649
|
+
* and the [Mutation Observer API](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver) to monitor lazy-loaded elements.
|
|
650
|
+
*
|
|
651
|
+
* Example usage:
|
|
652
|
+
*
|
|
653
|
+
* ```ts
|
|
654
|
+
* tracker.addElementVisibilityObserver('[data-pulse-entity-id]', (element) => {
|
|
655
|
+
* const eventInput = parseElementIntoEventInput(element); // user-defined function
|
|
656
|
+
* tracker.trackImpressionTeaser(eventInput); // can be anything actually, not necessarily a Teaser tracking call
|
|
657
|
+
* });
|
|
658
|
+
* ```
|
|
659
|
+
* @param selector
|
|
660
|
+
* @param callback
|
|
661
|
+
* @param options {ObserverOptions}
|
|
662
|
+
* @param options.threshold - A number between 0 and 1 indicating how much of the element should be visible to trigger
|
|
663
|
+
* the callback. Default is 0.67 (2/3 of the element).
|
|
664
|
+
*/
|
|
665
|
+
addElementVisibilityObserver(selector, callback, options = {}) {
|
|
666
|
+
if (this.visibilityObservers.has(selector)) {
|
|
667
|
+
console.warn(`Cannot add UI Element visibility tracking for selector "${selector}" as it is already being tracked.`);
|
|
668
|
+
return;
|
|
669
|
+
}
|
|
670
|
+
this.visibilityObservers.set(selector, new VisibilityObserver((element) => {
|
|
671
|
+
callback(element);
|
|
672
|
+
}));
|
|
673
|
+
this.visibilityObservers.get(selector)?.observe(selector, options);
|
|
615
674
|
}
|
|
616
675
|
/**
|
|
617
676
|
* The old trackViewArticle method from the Media Wrapper.
|
|
@@ -705,7 +764,7 @@ export default class Tracker {
|
|
|
705
764
|
* @category Legacy Tracking
|
|
706
765
|
*/
|
|
707
766
|
trackLegacyViewUIElement(inputProperties, trackOptions) {
|
|
708
|
-
const viewUIElementEventData = buildLegacyViewUIElementEvent(inputProperties, this.
|
|
767
|
+
const viewUIElementEventData = buildLegacyViewUIElementEvent(inputProperties, this.getCurrentLegacyPage());
|
|
709
768
|
return this.track('trackerEvent', viewUIElementEventData, trackOptions);
|
|
710
769
|
}
|
|
711
770
|
/**
|
|
@@ -716,7 +775,7 @@ export default class Tracker {
|
|
|
716
775
|
* @category Legacy Tracking
|
|
717
776
|
*/
|
|
718
777
|
trackLegacyClickUIElement(inputProperties, trackOptions) {
|
|
719
|
-
const clickUIElementEventData = buildClickUIElementEvent(inputProperties, this.
|
|
778
|
+
const clickUIElementEventData = buildClickUIElementEvent(inputProperties, this.getCurrentLegacyPage());
|
|
720
779
|
return this.track('trackerEvent', clickUIElementEventData, trackOptions);
|
|
721
780
|
}
|
|
722
781
|
/**
|
|
@@ -748,14 +807,13 @@ export default class Tracker {
|
|
|
748
807
|
const event = buildViewHealthPageEvent(input, dependencies);
|
|
749
808
|
const result = this.sendTpaasEvent(event);
|
|
750
809
|
if (shouldEnableLeaveTracking(options.leaveTracking)) {
|
|
751
|
-
const
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
this.trackLeavePage({
|
|
810
|
+
const leavePageCallback = async (leave) => {
|
|
811
|
+
// HealthView Page is a bit special, in the sense that in doesn't have a dedicated Leave event.
|
|
812
|
+
// Instead, we need to reuse the generic Leave Page event, but adapt the input accordingly.
|
|
813
|
+
// This means omitting some fields from HealthView Page that are not part of Leave Page schema.
|
|
814
|
+
const { experiments, metrics, object, origin, ...restInput } = input;
|
|
815
|
+
const { category, custom, intent, name, tags, ...restObject } = input.object;
|
|
816
|
+
await this.trackLeavePage({
|
|
759
817
|
leave,
|
|
760
818
|
...restInput,
|
|
761
819
|
object: {
|
|
@@ -765,10 +823,7 @@ export default class Tracker {
|
|
|
765
823
|
});
|
|
766
824
|
};
|
|
767
825
|
addTpaasLeaveTracking({
|
|
768
|
-
|
|
769
|
-
pageElement,
|
|
770
|
-
objectResizable,
|
|
771
|
-
heightBuilder,
|
|
826
|
+
...options.leaveTracking,
|
|
772
827
|
schema: LeavePage.object.objectType,
|
|
773
828
|
trackMethod: leavePageCallback,
|
|
774
829
|
});
|
|
@@ -792,18 +847,14 @@ export default class Tracker {
|
|
|
792
847
|
const event = buildViewPageEvent(input, dependencies);
|
|
793
848
|
const result = this.sendTpaasEvent(event);
|
|
794
849
|
if (shouldEnableLeaveTracking(options.leaveTracking)) {
|
|
795
|
-
const
|
|
796
|
-
|
|
797
|
-
this.trackLeavePage({
|
|
850
|
+
const leavePageCallback = async (leave) => {
|
|
851
|
+
await this.trackLeavePage({
|
|
798
852
|
leave,
|
|
799
853
|
...input,
|
|
800
854
|
});
|
|
801
855
|
};
|
|
802
856
|
addTpaasLeaveTracking({
|
|
803
|
-
|
|
804
|
-
pageElement,
|
|
805
|
-
objectResizable,
|
|
806
|
-
heightBuilder,
|
|
857
|
+
...options.leaveTracking,
|
|
807
858
|
schema: LeavePage.object.objectType,
|
|
808
859
|
trackMethod: leavePageCallback,
|
|
809
860
|
});
|
|
@@ -822,18 +873,14 @@ export default class Tracker {
|
|
|
822
873
|
const event = buildViewSportsPageEvent(input, dependencies);
|
|
823
874
|
const result = this.sendTpaasEvent(event);
|
|
824
875
|
if (shouldEnableLeaveTracking(options.leaveTracking)) {
|
|
825
|
-
const
|
|
826
|
-
|
|
827
|
-
this.trackLeaveSportsPage({
|
|
876
|
+
const leaveSportsPageCallback = async (leave) => {
|
|
877
|
+
await this.trackLeaveSportsPage({
|
|
828
878
|
leave,
|
|
829
879
|
...input,
|
|
830
880
|
});
|
|
831
881
|
};
|
|
832
882
|
addTpaasLeaveTracking({
|
|
833
|
-
|
|
834
|
-
pageElement,
|
|
835
|
-
objectResizable,
|
|
836
|
-
heightBuilder,
|
|
883
|
+
...options.leaveTracking,
|
|
837
884
|
schema: LeaveSportsPage.object.objectType,
|
|
838
885
|
trackMethod: leaveSportsPageCallback,
|
|
839
886
|
});
|
|
@@ -873,18 +920,14 @@ export default class Tracker {
|
|
|
873
920
|
const event = buildViewArticleEvent(input, dependencies);
|
|
874
921
|
const result = this.sendTpaasEvent(event);
|
|
875
922
|
if (shouldEnableLeaveTracking(options.leaveTracking)) {
|
|
876
|
-
const
|
|
877
|
-
|
|
878
|
-
this.trackLeaveArticle({
|
|
923
|
+
const leaveArticleCallback = async (leave) => {
|
|
924
|
+
await this.trackLeaveArticle({
|
|
879
925
|
leave,
|
|
880
926
|
...input,
|
|
881
927
|
});
|
|
882
928
|
};
|
|
883
929
|
addTpaasLeaveTracking({
|
|
884
|
-
|
|
885
|
-
pageElement,
|
|
886
|
-
heightBuilder,
|
|
887
|
-
objectResizable,
|
|
930
|
+
...options.leaveTracking,
|
|
888
931
|
schema: LeaveArticle.object.objectType,
|
|
889
932
|
trackMethod: leaveArticleCallback,
|
|
890
933
|
});
|
|
@@ -938,15 +981,15 @@ export default class Tracker {
|
|
|
938
981
|
const event = buildViewAudioPageEvent(input, dependencies);
|
|
939
982
|
const result = this.sendTpaasEvent(event);
|
|
940
983
|
if (shouldEnableLeaveTracking(options.leaveTracking)) {
|
|
941
|
-
const {
|
|
942
|
-
const leaveAudioPageCallback = (leave) => {
|
|
984
|
+
const { leaveAudioBuilder, ...restLeaveTrackingOptions } = options.leaveTracking;
|
|
985
|
+
const leaveAudioPageCallback = async (leave) => {
|
|
943
986
|
const leaveAudioInput = leaveAudioBuilder?.() ?? {
|
|
944
987
|
audioCompleted: 0,
|
|
945
988
|
audioStarted: 0,
|
|
946
989
|
maxPlaylistPosition: 0,
|
|
947
990
|
playlistPositionPercentage: 0,
|
|
948
991
|
};
|
|
949
|
-
this.trackLeaveAudioPage({
|
|
992
|
+
await this.trackLeaveAudioPage({
|
|
950
993
|
leave,
|
|
951
994
|
leaveAudio: {
|
|
952
995
|
...leaveAudioInput,
|
|
@@ -957,10 +1000,7 @@ export default class Tracker {
|
|
|
957
1000
|
});
|
|
958
1001
|
};
|
|
959
1002
|
addTpaasLeaveTracking({
|
|
960
|
-
|
|
961
|
-
pageElement,
|
|
962
|
-
heightBuilder,
|
|
963
|
-
objectResizable,
|
|
1003
|
+
...restLeaveTrackingOptions,
|
|
964
1004
|
schema: LeaveAudioPage.object.objectType,
|
|
965
1005
|
trackMethod: leaveAudioPageCallback,
|
|
966
1006
|
});
|
|
@@ -979,24 +1019,29 @@ export default class Tracker {
|
|
|
979
1019
|
const event = buildViewErrorEvent(input, dependencies);
|
|
980
1020
|
const result = this.sendTpaasEvent(event);
|
|
981
1021
|
if (shouldEnableLeaveTracking(options.leaveTracking)) {
|
|
982
|
-
const
|
|
983
|
-
|
|
984
|
-
this.trackLeaveError({
|
|
1022
|
+
const leaveErrorCallback = async (leave) => {
|
|
1023
|
+
await this.trackLeaveError({
|
|
985
1024
|
leave,
|
|
986
1025
|
...input,
|
|
987
1026
|
});
|
|
988
1027
|
};
|
|
989
1028
|
addTpaasLeaveTracking({
|
|
990
|
-
|
|
991
|
-
pageElement,
|
|
992
|
-
heightBuilder,
|
|
993
|
-
objectResizable,
|
|
1029
|
+
...options.leaveTracking,
|
|
994
1030
|
schema: LeaveError.object.objectType,
|
|
995
1031
|
trackMethod: leaveErrorCallback,
|
|
996
1032
|
});
|
|
997
1033
|
}
|
|
998
1034
|
return result;
|
|
999
1035
|
}
|
|
1036
|
+
/**
|
|
1037
|
+
* @param input
|
|
1038
|
+
* @category TPaaS Tracking
|
|
1039
|
+
*/
|
|
1040
|
+
async trackImpressionAdSlot(input) {
|
|
1041
|
+
const dependencies = await this.prepareTpaasEvent();
|
|
1042
|
+
const event = buildImpressionAdSlotEvent(input, dependencies);
|
|
1043
|
+
return this.sendTpaasEvent(event);
|
|
1044
|
+
}
|
|
1000
1045
|
/**
|
|
1001
1046
|
* @param input
|
|
1002
1047
|
* @category TPaaS Tracking
|
|
@@ -1054,18 +1099,14 @@ export default class Tracker {
|
|
|
1054
1099
|
const event = buildViewFrontpageEvent(input, dependencies);
|
|
1055
1100
|
const result = this.sendTpaasEvent(event);
|
|
1056
1101
|
if (shouldEnableLeaveTracking(options.leaveTracking)) {
|
|
1057
|
-
const
|
|
1058
|
-
|
|
1059
|
-
this.trackLeaveFrontpage({
|
|
1102
|
+
const leaveFrontpageCallback = async (leave) => {
|
|
1103
|
+
await this.trackLeaveFrontpage({
|
|
1060
1104
|
leave,
|
|
1061
1105
|
...input,
|
|
1062
1106
|
});
|
|
1063
1107
|
};
|
|
1064
1108
|
addTpaasLeaveTracking({
|
|
1065
|
-
|
|
1066
|
-
pageElement,
|
|
1067
|
-
objectResizable,
|
|
1068
|
-
heightBuilder,
|
|
1109
|
+
...options.leaveTracking,
|
|
1069
1110
|
schema: LeaveFrontpage.object.objectType,
|
|
1070
1111
|
trackMethod: leaveFrontpageCallback,
|
|
1071
1112
|
});
|
|
@@ -1084,18 +1125,14 @@ export default class Tracker {
|
|
|
1084
1125
|
const event = buildViewLandingpageEvent(input, dependencies);
|
|
1085
1126
|
const result = this.sendTpaasEvent(event);
|
|
1086
1127
|
if (shouldEnableLeaveTracking(options.leaveTracking)) {
|
|
1087
|
-
const
|
|
1088
|
-
|
|
1089
|
-
this.trackLeaveLandingpage({
|
|
1128
|
+
const leaveLandingpageCallback = async (leave) => {
|
|
1129
|
+
await this.trackLeaveLandingpage({
|
|
1090
1130
|
leave,
|
|
1091
1131
|
...input,
|
|
1092
1132
|
});
|
|
1093
1133
|
};
|
|
1094
1134
|
addTpaasLeaveTracking({
|
|
1095
|
-
|
|
1096
|
-
pageElement,
|
|
1097
|
-
heightBuilder,
|
|
1098
|
-
objectResizable,
|
|
1135
|
+
...options.leaveTracking,
|
|
1099
1136
|
schema: LeaveLandingpage.object.objectType,
|
|
1100
1137
|
trackMethod: leaveLandingpageCallback,
|
|
1101
1138
|
});
|
|
@@ -1114,18 +1151,18 @@ export default class Tracker {
|
|
|
1114
1151
|
const event = buildViewListingEvent(input, dependencies);
|
|
1115
1152
|
const result = this.sendTpaasEvent(event);
|
|
1116
1153
|
if (shouldEnableLeaveTracking(options.leaveTracking)) {
|
|
1117
|
-
const
|
|
1118
|
-
|
|
1119
|
-
this.trackLeaveListing({
|
|
1154
|
+
const leaveListingCallback = async (leave) => {
|
|
1155
|
+
await this.trackLeaveListing({
|
|
1120
1156
|
leave,
|
|
1121
1157
|
...input,
|
|
1158
|
+
object: {
|
|
1159
|
+
...input.object,
|
|
1160
|
+
listingType: 'Tag,Story,Section,Search,Author,Other', // TODO: listingType is broken for this catalog. will be fixed in the next one
|
|
1161
|
+
},
|
|
1122
1162
|
});
|
|
1123
1163
|
};
|
|
1124
1164
|
addTpaasLeaveTracking({
|
|
1125
|
-
|
|
1126
|
-
pageElement,
|
|
1127
|
-
heightBuilder,
|
|
1128
|
-
objectResizable,
|
|
1165
|
+
...options.leaveTracking,
|
|
1129
1166
|
schema: LeaveListing.object.objectType,
|
|
1130
1167
|
trackMethod: leaveListingCallback,
|
|
1131
1168
|
});
|
|
@@ -1144,18 +1181,14 @@ export default class Tracker {
|
|
|
1144
1181
|
const event = buildViewLockedArticleEvent(input, dependencies);
|
|
1145
1182
|
const result = this.sendTpaasEvent(event);
|
|
1146
1183
|
if (shouldEnableLeaveTracking(options.leaveTracking)) {
|
|
1147
|
-
const
|
|
1148
|
-
|
|
1149
|
-
this.trackLeaveLockedArticle({
|
|
1184
|
+
const leaveLockedArticleCallback = async (leave) => {
|
|
1185
|
+
await this.trackLeaveLockedArticle({
|
|
1150
1186
|
leave,
|
|
1151
1187
|
...input,
|
|
1152
1188
|
});
|
|
1153
1189
|
};
|
|
1154
1190
|
addTpaasLeaveTracking({
|
|
1155
|
-
|
|
1156
|
-
pageElement,
|
|
1157
|
-
objectResizable,
|
|
1158
|
-
heightBuilder,
|
|
1191
|
+
...options.leaveTracking,
|
|
1159
1192
|
schema: LeaveLockedArticle.object.objectType,
|
|
1160
1193
|
trackMethod: leaveLockedArticleCallback,
|
|
1161
1194
|
});
|
|
@@ -1174,18 +1207,14 @@ export default class Tracker {
|
|
|
1174
1207
|
const event = buildViewLockedAudioPageEvent(input, dependencies);
|
|
1175
1208
|
const result = this.sendTpaasEvent(event);
|
|
1176
1209
|
if (shouldEnableLeaveTracking(options.leaveTracking)) {
|
|
1177
|
-
const
|
|
1178
|
-
|
|
1179
|
-
this.trackLeaveLockedAudioPage({
|
|
1210
|
+
const leaveLockedAudioPageCallback = async (leave) => {
|
|
1211
|
+
await this.trackLeaveLockedAudioPage({
|
|
1180
1212
|
leave,
|
|
1181
1213
|
...input,
|
|
1182
1214
|
});
|
|
1183
1215
|
};
|
|
1184
1216
|
addTpaasLeaveTracking({
|
|
1185
|
-
|
|
1186
|
-
pageElement,
|
|
1187
|
-
heightBuilder,
|
|
1188
|
-
objectResizable,
|
|
1217
|
+
...options.leaveTracking,
|
|
1189
1218
|
schema: LeaveLockedAudioPage.object.objectType,
|
|
1190
1219
|
trackMethod: leaveLockedAudioPageCallback,
|
|
1191
1220
|
});
|
|
@@ -1204,18 +1233,14 @@ export default class Tracker {
|
|
|
1204
1233
|
const event = buildViewLockedVideoPageEvent(input, dependencies);
|
|
1205
1234
|
const result = this.sendTpaasEvent(event);
|
|
1206
1235
|
if (shouldEnableLeaveTracking(options.leaveTracking)) {
|
|
1207
|
-
const
|
|
1208
|
-
|
|
1209
|
-
this.trackLeaveLockedVideoPage({
|
|
1236
|
+
const leaveLockedVideoPageCallback = async (leave) => {
|
|
1237
|
+
await this.trackLeaveLockedVideoPage({
|
|
1210
1238
|
leave,
|
|
1211
1239
|
...input,
|
|
1212
1240
|
});
|
|
1213
1241
|
};
|
|
1214
1242
|
addTpaasLeaveTracking({
|
|
1215
|
-
|
|
1216
|
-
pageElement,
|
|
1217
|
-
heightBuilder,
|
|
1218
|
-
objectResizable,
|
|
1243
|
+
...options.leaveTracking,
|
|
1219
1244
|
schema: LeaveLockedVideoPage.object.objectType,
|
|
1220
1245
|
trackMethod: leaveLockedVideoPageCallback,
|
|
1221
1246
|
});
|
|
@@ -1271,10 +1296,10 @@ export default class Tracker {
|
|
|
1271
1296
|
const event = buildViewVideoPageEvent(input, dependencies);
|
|
1272
1297
|
const result = this.sendTpaasEvent(event);
|
|
1273
1298
|
if (shouldEnableLeaveTracking(options.leaveTracking)) {
|
|
1274
|
-
const {
|
|
1275
|
-
const leaveVideoCallback = (leave) => {
|
|
1299
|
+
const { leaveStoriesBuilder, ...restLeaveTrackingOptions } = options.leaveTracking;
|
|
1300
|
+
const leaveVideoCallback = async (leave) => {
|
|
1276
1301
|
const leaveStoriesInput = leaveStoriesBuilder?.();
|
|
1277
|
-
this.trackLeaveVideoPage({
|
|
1302
|
+
await this.trackLeaveVideoPage({
|
|
1278
1303
|
leave,
|
|
1279
1304
|
leaveStories: leaveStoriesInput && {
|
|
1280
1305
|
...leaveStoriesInput,
|
|
@@ -1285,10 +1310,7 @@ export default class Tracker {
|
|
|
1285
1310
|
});
|
|
1286
1311
|
};
|
|
1287
1312
|
addTpaasLeaveTracking({
|
|
1288
|
-
|
|
1289
|
-
pageElement,
|
|
1290
|
-
heightBuilder,
|
|
1291
|
-
objectResizable,
|
|
1313
|
+
...restLeaveTrackingOptions,
|
|
1292
1314
|
schema: LeaveVideoPage.object.objectType,
|
|
1293
1315
|
trackMethod: leaveVideoCallback,
|
|
1294
1316
|
});
|
|
@@ -1307,18 +1329,14 @@ export default class Tracker {
|
|
|
1307
1329
|
const event = buildViewWeatherEvent(input, dependencies);
|
|
1308
1330
|
const result = this.sendTpaasEvent(event);
|
|
1309
1331
|
if (shouldEnableLeaveTracking(options.leaveTracking)) {
|
|
1310
|
-
const
|
|
1311
|
-
|
|
1312
|
-
this.trackLeaveWeather({
|
|
1332
|
+
const leaveWeatherCallback = async (leave) => {
|
|
1333
|
+
await this.trackLeaveWeather({
|
|
1313
1334
|
leave,
|
|
1314
1335
|
...input,
|
|
1315
1336
|
});
|
|
1316
1337
|
};
|
|
1317
1338
|
addTpaasLeaveTracking({
|
|
1318
|
-
|
|
1319
|
-
pageElement,
|
|
1320
|
-
heightBuilder,
|
|
1321
|
-
objectResizable,
|
|
1339
|
+
...options.leaveTracking,
|
|
1322
1340
|
schema: LeaveWeather.object.objectType,
|
|
1323
1341
|
trackMethod: leaveWeatherCallback,
|
|
1324
1342
|
});
|
|
@@ -2157,8 +2175,8 @@ export default class Tracker {
|
|
|
2157
2175
|
* with the added guarantee that a second Leave event will not be triggered if one already has been sent.
|
|
2158
2176
|
* @category TPaaS Leave Tracking
|
|
2159
2177
|
*/
|
|
2160
|
-
trackTpaasActiveLeave() {
|
|
2161
|
-
trackTpaasActiveLeave();
|
|
2178
|
+
async trackTpaasActiveLeave() {
|
|
2179
|
+
await trackTpaasActiveLeave();
|
|
2162
2180
|
}
|
|
2163
2181
|
/**
|
|
2164
2182
|
* Check if leave tracking is enabled (if an event will be sent when the user leaves the page)
|
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
export const DEFAULT_ACTIVITY_DURATION = () => ({
|
|
2
|
-
value: 0,
|
|
3
|
-
interval: undefined,
|
|
4
|
-
timeSinceLastActivity: 0,
|
|
5
|
-
});
|
|
6
1
|
export const DEFAULT_PAGE_LEAVE_EVENT = () => ({
|
|
7
2
|
objectViewPercentage: 0,
|
|
8
3
|
maxObjectViewPercentage: 0,
|
|
@@ -11,3 +6,4 @@ export const DEFAULT_PAGE_LEAVE_EVENT = () => ({
|
|
|
11
6
|
pageScrollPosition: 0,
|
|
12
7
|
maxPageScrollPosition: 0,
|
|
13
8
|
});
|
|
9
|
+
export const ACTIVITY_DURATION_LIMIT_MS = 30000;
|