@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.
Files changed (37) hide show
  1. package/dist/cjs/Tracker.js +137 -119
  2. package/dist/cjs/leaveTrackingTpaas/constants.js +2 -7
  3. package/dist/cjs/leaveTrackingTpaas/index.js +52 -40
  4. package/dist/cjs/tracker-proxy/consts.js +3 -0
  5. package/dist/cjs/version.js +1 -1
  6. package/dist/cjs/visibility-observer/index.js +9 -7
  7. package/dist/cjs/wrapper/types/event.js +5 -0
  8. package/dist/ejs/Tracker.js +138 -120
  9. package/dist/ejs/leaveTrackingTpaas/constants.js +1 -5
  10. package/dist/ejs/leaveTrackingTpaas/index.js +53 -41
  11. package/dist/ejs/tracker-proxy/consts.js +3 -0
  12. package/dist/ejs/version.js +1 -1
  13. package/dist/ejs/visibility-observer/index.js +9 -7
  14. package/dist/ejs/wrapper/types/event.js +4 -1
  15. package/dist/types/Tracker.d.ts +55 -20
  16. package/dist/types/index.d.ts +1 -1
  17. package/dist/types/leaveTrackingTpaas/constants.d.ts +1 -5
  18. package/dist/types/leaveTrackingTpaas/index.d.ts +6 -6
  19. package/dist/types/leaveTrackingTpaas/types.d.ts +1 -9
  20. package/dist/types/tracker-proxy/consts.d.ts +1 -1
  21. package/dist/types/types.d.ts +19 -13
  22. package/dist/types/version.d.ts +1 -1
  23. package/dist/types/visibility-observer/index.d.ts +6 -1
  24. package/dist/types/wrapper/types/event.d.ts +3 -1
  25. package/node_modules/@schibsted/pulse-utils/package.json +1 -1
  26. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders.js +5 -1
  27. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/guards.js +7 -0
  28. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/index.js +3 -0
  29. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders.js +5 -2
  30. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/guards.js +4 -0
  31. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/index.js +1 -0
  32. package/node_modules/@schibsted/tpaas-event-builder/dist/index.d.ts +792 -166
  33. package/node_modules/@schibsted/tpaas-event-builder/package.json +1 -1
  34. package/node_modules/@schibsted/tpaas-schemas/dist/cjs/constants.js +66 -57
  35. package/node_modules/@schibsted/tpaas-schemas/dist/ejs/constants.js +64 -55
  36. package/node_modules/@schibsted/tpaas-schemas/dist/index.d.ts +836 -219
  37. package/package.json +4 -4
@@ -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
- this.legacyCurrentPage = {
136
- id: 'undefined-id',
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: typeof window !== 'undefined' ? window.location.href : '',
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.legacyCurrentPage = pageFromPageView(pageViewEvent);
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
- pageId: id,
161
- pageType: type,
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: this.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.legacyCurrentPage);
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.legacyCurrentPage);
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 { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
752
- // HealthView Page is a bit special, in the sense that in doesn't have a dedicated Leave event.
753
- // Instead, we need to reuse the generic Leave Page event, but adapt the input accordingly.
754
- // This means omitting some fields from HealthView Page that are not part of Leave Page schema.
755
- const { experiments, metrics, object, ...restInput } = input;
756
- const { category, custom, intent, name, tags, ...restObject } = input.object;
757
- const leavePageCallback = (leave) => {
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
- objectElement,
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 { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
796
- const leavePageCallback = (leave) => {
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
- objectElement,
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 { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
826
- const leaveSportsPageCallback = (leave) => {
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
- objectElement,
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 { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
877
- const leaveArticleCallback = (leave) => {
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
- objectElement,
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 { objectElement, pageElement, heightBuilder, objectResizable, leaveAudioBuilder } = options.leaveTracking;
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
- objectElement,
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 { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
983
- const leaveErrorCallback = (leave) => {
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
- objectElement,
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 { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
1058
- const leaveFrontpageCallback = (leave) => {
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
- objectElement,
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 { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
1088
- const leaveLandingpageCallback = (leave) => {
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
- objectElement,
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 { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
1118
- const leaveListingCallback = (leave) => {
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
- objectElement,
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 { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
1148
- const leaveLockedArticleCallback = (leave) => {
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
- objectElement,
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 { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
1178
- const leaveLockedAudioPageCallback = (leave) => {
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
- objectElement,
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 { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
1208
- const leaveLockedVideoPageCallback = (leave) => {
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
- objectElement,
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 { objectElement, pageElement, heightBuilder, objectResizable, leaveStoriesBuilder } = options.leaveTracking;
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
- objectElement,
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 { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
1311
- const leaveWeatherCallback = (leave) => {
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
- objectElement,
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;