diff --git a/README.rst b/README.rst index b77af7f0..a3d1a199 100644 --- a/README.rst +++ b/README.rst @@ -8,7 +8,7 @@ frontend-enterprise - `@edx/frontend-enterprise-catalog-search `_ - `@edx/frontend-enterprise-logistration `_ - `@edx/frontend-enterprise-utils `_ -- `@edx/frontend-enterprise-hotjar ` +- `@edx/frontend-enterprise-hotjar `_ Each of these packages is published to NPM and have their own README files. The packages can be found in the ``packages/*`` folder. diff --git a/packages/utils/src/analytics.js b/packages/utils/src/analytics.js index f873bf94..5e90997b 100644 --- a/packages/utils/src/analytics.js +++ b/packages/utils/src/analytics.js @@ -1,6 +1,6 @@ import { sendTrackEvent } from '@edx/frontend-platform/analytics'; -const sendEnterpriseTrackEvent = (enterpriseUUID, eventName, properties = {}) => { +export const sendEnterpriseTrackEvent = (enterpriseUUID, eventName, properties = {}) => { sendTrackEvent( eventName, { @@ -10,4 +10,23 @@ const sendEnterpriseTrackEvent = (enterpriseUUID, eventName, properties = {}) => ); }; -export default sendEnterpriseTrackEvent; +// How long to delay an event, so that we allow enough time for any async analytics event call to resolve. +// https://segment.com/docs/connections/sources/catalog/libraries/website/javascript/ +export const TRACK_EVENT_DELAY_MS = 300; // 300ms replicates Segment's ``trackLink`` function + +/** + * Delay for a certain period to allow time for analytics event call to resolve. + */ +export const sendEnterpriseTrackEventWithDelay = ( + enterpriseId, + eventName, + properties = {}, + delay = TRACK_EVENT_DELAY_MS, +) => { + sendEnterpriseTrackEvent( + enterpriseId, + eventName, + properties, + ); + return new Promise((resolve) => setTimeout(resolve, delay)); +}; diff --git a/packages/utils/src/index.js b/packages/utils/src/index.js index ebdd26e2..6a6b4622 100644 --- a/packages/utils/src/index.js +++ b/packages/utils/src/index.js @@ -17,6 +17,6 @@ export { hasFeatureFlagEnabled, } from './utils'; export { renderWithRouter } from './test-utils'; -export { default as sendEnterpriseTrackEvent } from './analytics'; +export { sendEnterpriseTrackEvent, sendEnterpriseTrackEventWithDelay, TRACK_EVENT_DELAY_MS } from './analytics'; export { default as getLearnerPortalLinks } from './learnerPortalLinks'; diff --git a/packages/utils/src/tests/analytics.test.js b/packages/utils/src/tests/analytics.test.js index 56680c06..03085cf8 100644 --- a/packages/utils/src/tests/analytics.test.js +++ b/packages/utils/src/tests/analytics.test.js @@ -1,6 +1,6 @@ import { sendTrackEvent } from '@edx/frontend-platform/analytics'; -import sendEnterpriseTrackEvent from '../analytics'; +import { sendEnterpriseTrackEvent, sendEnterpriseTrackEventWithDelay, TRACK_EVENT_DELAY_MS } from '../analytics'; jest.mock('@edx/frontend-platform/analytics'); @@ -17,3 +17,40 @@ describe('sendEnterpriseTrackEvent', () => { }); }); }); + +describe('sendEnterpriseTrackEventWithDelay', () => { + jest.spyOn(global, 'setTimeout'); + + const mockEnterpriseUUID = '1'; + const mockEventName = 'event'; + const mockEventProperties = { property1: 'property 1' }; + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should call sendTrackEvent after default delay', async () => { + await sendEnterpriseTrackEventWithDelay(mockEnterpriseUUID, mockEventName, mockEventProperties); + + expect(sendTrackEvent).toHaveBeenCalledWith(mockEventName, { + enterpriseUUID: mockEnterpriseUUID, + ...mockEventProperties, + }); + + expect(setTimeout).toHaveBeenCalledTimes(1); + expect(setTimeout).toHaveBeenLastCalledWith(expect.any(Function), TRACK_EVENT_DELAY_MS); + }); + + it('should call sendTrackEvent after custom delay', async () => { + const customDelay = 3000; + await sendEnterpriseTrackEventWithDelay(mockEnterpriseUUID, mockEventName, mockEventProperties, customDelay); + + expect(sendTrackEvent).toHaveBeenCalledWith(mockEventName, { + enterpriseUUID: mockEnterpriseUUID, + ...mockEventProperties, + }); + + expect(setTimeout).toHaveBeenCalledTimes(1); + expect(setTimeout).toHaveBeenLastCalledWith(expect.any(Function), customDelay); + }); +});