Skip to content

Commit

Permalink
refactor: trackPageLifecycleEvents fn
Browse files Browse the repository at this point in the history
  • Loading branch information
MoumitaM committed Oct 9, 2024
1 parent 9c4a494 commit 02ffa04
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 57 deletions.
4 changes: 2 additions & 2 deletions packages/analytics-js-common/src/types/LoadOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,8 @@ export type PreConsentOptions = {
};

export enum PageLifecycleEvents {
PAGELOADED = 'Page Loaded',
PAGEUNLOADED = 'Page Unloaded',
LOADED = 'Page Loaded',
UNLOADED = 'Page Unloaded',

Check warning on line 113 in packages/analytics-js-common/src/types/LoadOptions.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js-common/src/types/LoadOptions.ts#L112-L113

Added lines #L112 - L113 were not covered by tests
}

export type TrackPageLifecycleOptions = {
Expand Down
103 changes: 51 additions & 52 deletions packages/analytics-js/src/app/RudderAnalytics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -153,60 +153,59 @@ class RudderAnalytics implements IRudderAnalytics<IAnalytics> {
loadOptions?: Partial<LoadOptions>,
) {
const { trackPageLifecycle, useBeacon } = loadOptions ?? {};
const { events = [], enabled = false, options = {} } = trackPageLifecycle ?? {};
if (enabled) {
const visitId = generateUUID();
const pageLoadedTimestamp = Date.now();
if (events.length === 0 || events.includes(PageLifecycleEvents.PAGELOADED)) {
preloadedEventsArray.unshift([
'track',
PageLifecycleEvents.PAGELOADED,
{ visitId },
{
originalTimestamp: new Date(pageLoadedTimestamp).toISOString(),
...options,
},
]);
}
if (events.length === 0 || events.includes(PageLifecycleEvents.PAGEUNLOADED)) {
if (useBeacon === true) {
// Register the page unloaded lifecycle event listeners
onPageLeave((isAccessible: boolean) => {
if (isAccessible === false) {
const visitDuration = Date.now() - pageLoadedTimestamp;
if (!state.lifecycle.loaded.value) {
preloadedEventsArray.unshift([
'track',
PageLifecycleEvents.PAGEUNLOADED,
{
visitId,
visitDuration,
},
{
...options,
},
]);
} else {
this.track(
PageLifecycleEvents.PAGEUNLOADED,
{
visitId,
visitDuration,
},
{
...options,
},
);
}
}
});
} else {
// throw warning if beacon is disabled
this.logger.warn(PAGE_UNLOAD_ON_BEACON_DISABLED_WARNING());
}
const {
events = [PageLifecycleEvents.LOADED, PageLifecycleEvents.UNLOADED],
enabled = false,
options = {},
} = trackPageLifecycle ?? {};

if (!enabled) {
return;
}

const visitId = generateUUID();
const pageLoadedTimestamp = Date.now();

Check warning on line 167 in packages/analytics-js/src/app/RudderAnalytics.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js/src/app/RudderAnalytics.ts#L166-L167

Added lines #L166 - L167 were not covered by tests

// track page loaded event
if (events.length === 0 || events.includes(PageLifecycleEvents.LOADED)) {
preloadedEventsArray.unshift([

Check warning on line 171 in packages/analytics-js/src/app/RudderAnalytics.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js/src/app/RudderAnalytics.ts#L171

Added line #L171 was not covered by tests
'track',
PageLifecycleEvents.LOADED,
{ visitId },
{
...options,
originalTimestamp: new Date(pageLoadedTimestamp).toISOString(),
},
]);
}

// track page unloaded event
if (events.length === 0 || events.includes(PageLifecycleEvents.UNLOADED)) {
if (useBeacon === true) {
// Register the page unloaded lifecycle event listeners
onPageLeave((isAccessible: boolean) => {

Check warning on line 186 in packages/analytics-js/src/app/RudderAnalytics.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js/src/app/RudderAnalytics.ts#L186

Added line #L186 was not covered by tests
if (isAccessible === false && state.lifecycle.loaded.value) {
const pageUnloadedTimestamp = Date.now();
const visitDuration = pageUnloadedTimestamp - pageLoadedTimestamp;
this.track(

Check warning on line 190 in packages/analytics-js/src/app/RudderAnalytics.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js/src/app/RudderAnalytics.ts#L188-L190

Added lines #L188 - L190 were not covered by tests
PageLifecycleEvents.UNLOADED,
{
visitId,
visitDuration,
},
{
...options,
originalTimestamp: new Date(pageUnloadedTimestamp).toISOString(),
},
);
}
});
} else {
// throw warning if beacon is disabled
this.logger.warn(PAGE_UNLOAD_ON_BEACON_DISABLED_WARNING);

Check warning on line 205 in packages/analytics-js/src/app/RudderAnalytics.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js/src/app/RudderAnalytics.ts#L205

Added line #L205 was not covered by tests
}
setExposedGlobal(GLOBAL_PRELOAD_BUFFER, clone(preloadedEventsArray));
}
setExposedGlobal(GLOBAL_PRELOAD_BUFFER, clone(preloadedEventsArray));

Check warning on line 208 in packages/analytics-js/src/app/RudderAnalytics.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js/src/app/RudderAnalytics.ts#L208

Added line #L208 was not covered by tests
}

/**
Expand Down
3 changes: 1 addition & 2 deletions packages/analytics-js/src/constants/logMessages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -257,8 +257,7 @@ const INVALID_POLYFILL_URL_WARNING = (
const BAD_COOKIES_WARNING = (key: string) =>
`The cookie data for ${key} seems to be encrypted using SDK versions < v3. The data is dropped. This can potentially stem from using SDK versions < v3 on other sites or web pages that can share cookies with this webpage. We recommend using the same SDK (v3) version everywhere or avoid disabling the storage data migration.`;

const PAGE_UNLOAD_ON_BEACON_DISABLED_WARNING = (): string =>
`Page Unloaded event is only supported for Beacon transport mechanism. Please set useBeacon to true to enable this feature.`;
const PAGE_UNLOAD_ON_BEACON_DISABLED_WARNING = `Page Unloaded event can only be tracked when the Beacon transport is active. Please enable "useBeacon" load API option.`;

export {
UNSUPPORTED_CONSENT_MANAGER_ERROR,
Expand Down
2 changes: 1 addition & 1 deletion packages/analytics-js/src/state/slices/loadOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ const defaultLoadOptions: LoadOptions = {
useServerSideCookies: false,
trackPageLifecycle: {
enabled: false,
events: [PageLifecycleEvents.PAGELOADED, PageLifecycleEvents.PAGEUNLOADED],
events: [PageLifecycleEvents.LOADED, PageLifecycleEvents.UNLOADED],
},
};

Expand Down

0 comments on commit 02ffa04

Please sign in to comment.