Skip to content

Commit e24ee91

Browse files
author
Gijs Nieuwenhuis
committed
Added dataLayer utility
1 parent 9790da7 commit e24ee91

File tree

4 files changed

+105
-0
lines changed

4 files changed

+105
-0
lines changed

README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ A library containing javascript utilities that we until now often copy between p
2121
- [`createNamespacedLogger`](#createnamespacedlogger)
2222
- [`RestartableTimeout`](#restartabletimeout)
2323
- [`PromiseQueue`](#promisequeue)
24+
- [`dataLayer`](#datalayer)
25+
- [`pushTrackingEvent`](#pushtrackingevent)
2426
- [React](#react)
2527
- [Components](#components)
2628
- [`ErrorBoundary`](#errorboundary)
@@ -317,6 +319,20 @@ queue.length; // returns the current length of the queue
317319
queue.started; // returns true if started
318320
```
319321
322+
### dataLayer
323+
324+
#### `pushTrackingEvent`
325+
326+
Pushes an event to the dataLayer to be picked up by Google Tag Manager, in a standardized format.
327+
328+
Usage:
329+
330+
```typescript
331+
import { pushTrackingEvent } from '@freshheads/javascript-essentials/build/utilities/dataLayer';
332+
333+
pushTrackingEvent('preorder', 'submit', { subscribeToNewsletter: false });
334+
```
335+
320336
## React
321337
322338
### Components

src/global.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
interface Window {
2+
dataLayer?: Array<{
3+
event: string;
4+
action: string;
5+
[key: string]: any;
6+
}>;
7+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import { pushTrackingEvent } from '../dataLayer';
2+
3+
describe('dataLayer', () => {
4+
describe('pushTrackingEvent', () => {
5+
describe('When no dataLayer exists', () => {
6+
it('should create a new data layer and add the event to it', () => {
7+
// @ts-ignore => typescript does not know about dataLayer on window
8+
delete window.dataLayer;
9+
10+
pushTrackingEvent('preorder', 'submit', {
11+
subscribeToNewsletter: true,
12+
});
13+
14+
// @ts-ignore => typescript does not know about dataLayer on window
15+
expect(window.dataLayer).toBeDefined();
16+
17+
// @ts-ignore => typescript does not know about dataLayer on window
18+
expect(Array.isArray(window.dataLayer)).toBe(true);
19+
20+
// @ts-ignore => typescript does not know about dataLayer on window
21+
expect(window.dataLayer).toHaveLength(1);
22+
23+
// @ts-ignore => typescript does not know about dataLayer on window
24+
const firstItem = window.dataLayer[0];
25+
26+
expect(firstItem).toEqual({
27+
event: 'preorder',
28+
action: 'submit',
29+
context: {
30+
subscribeToNewsletter: true,
31+
},
32+
});
33+
});
34+
});
35+
36+
describe('When a dataLayer already exists', () => {
37+
it('should add the event to the existing events in the dataLayer', () => {
38+
// @ts-ignore => typescript does not know about dataLayer on window
39+
window.dataLayer = [
40+
{
41+
event: 'other_event',
42+
action: 'click',
43+
},
44+
];
45+
46+
pushTrackingEvent('preorder', 'submit');
47+
48+
// @ts-ignore => Typescript does not know about dataLayer property
49+
expect(window.dataLayer).toBeDefined();
50+
51+
// @ts-ignore => typescript does not know about dataLayer on window
52+
expect(Array.isArray(window.dataLayer)).toBe(true);
53+
54+
// @ts-ignore => typescript does not know about dataLayer on window
55+
expect(window.dataLayer).toHaveLength(2);
56+
57+
// @ts-ignore => typescript does not know about dataLayer on window
58+
const addedItem = window.dataLayer[1];
59+
60+
expect(addedItem).toEqual({
61+
event: 'preorder',
62+
action: 'submit',
63+
});
64+
});
65+
});
66+
});
67+
});

src/utilities/dataLayer.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { Serializable } from '../types/utility';
2+
3+
/**
4+
* @param {String} event i.e. preorder
5+
* @param {String} action i.e. submit
6+
* @param {Serializable=} context i.e. { subscribeToNewsletter: true }
7+
*/
8+
export function pushTrackingEvent(
9+
event: string,
10+
action: string,
11+
context?: Serializable
12+
): void {
13+
window.dataLayer = window.dataLayer || [];
14+
window.dataLayer.push({ event, action, context });
15+
}

0 commit comments

Comments
 (0)