Skip to content

Commit d388ff8

Browse files
Merge pull request #12276 from bbc/WSTEAM1-1549-live-media-tracking-new
WSTEAM1-1549: Adds click view tracking to Live Header Media
2 parents 1d4372b + 500e012 commit d388ff8

File tree

2 files changed

+56
-5
lines changed

2 files changed

+56
-5
lines changed

src/app/components/LiveHeaderMedia/index.test.tsx

+37
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,16 @@ import {
77
render,
88
fireEvent,
99
} from '../react-testing-library-with-providers';
10+
import * as viewTracking from '../../hooks/useViewTracker';
11+
import * as clickTracking from '../../hooks/useClickTrackerHandler';
1012

1113
const fixtureData = mundoLiveFixture.data.mediaCollections;
1214

1315
describe('liveMediaStream', () => {
16+
beforeEach(() => {
17+
jest.clearAllMocks();
18+
});
19+
1420
it('Displays all components on intial render.', () => {
1521
const { container } = render(
1622
<LiveHeaderMedia mediaCollection={fixtureData as MediaCollection[]} />,
@@ -226,4 +232,35 @@ describe('liveMediaStream', () => {
226232

227233
expect(window.mediaPlayers.p0gh4n67.play).toHaveBeenCalledTimes(playCalls);
228234
});
235+
236+
describe('Event Tracking', () => {
237+
const eventTrackingData = { componentName: 'live-header-media' };
238+
239+
describe('Click tracking', () => {
240+
const clickTrackerSpy = jest.spyOn(clickTracking, 'default');
241+
242+
it('should register click tracker', () => {
243+
render(
244+
<LiveHeaderMedia
245+
mediaCollection={fixtureData as MediaCollection[]}
246+
/>,
247+
);
248+
expect(clickTrackerSpy).toHaveBeenCalledWith(eventTrackingData);
249+
});
250+
});
251+
252+
describe('View tracking', () => {
253+
const viewTrackerSpy = jest.spyOn(viewTracking, 'default');
254+
255+
it('should register view tracker', () => {
256+
render(
257+
<LiveHeaderMedia
258+
mediaCollection={fixtureData as MediaCollection[]}
259+
/>,
260+
);
261+
262+
expect(viewTrackerSpy).toHaveBeenCalledWith(eventTrackingData);
263+
});
264+
});
265+
});
229266
});

src/app/components/LiveHeaderMedia/index.tsx

+19-5
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ import MediaLoader from '#app/components/MediaLoader';
88
import filterForBlockType from '#app/lib/utilities/blockHandlers';
99
import { ServiceContext } from '#app/contexts/ServiceContext';
1010
import { RequestContext } from '#app/contexts/RequestContext';
11+
import useViewTracker from '#app/hooks/useViewTracker';
12+
import useClickTrackerHandler from '#app/hooks/useClickTrackerHandler';
13+
import { EventTrackingMetadata } from '#app/models/types/eventTracking';
1114
import { regexPunctuationSymbols } from '#app/lib/utilities/idSanitiser';
1215
import styles from './index.styles';
1316
import WARNING_LEVELS from '../MediaLoader/configs/warningLevels';
@@ -21,7 +24,7 @@ type WarningItem = {
2124
short_description: string;
2225
};
2326

24-
type Props = {
27+
type LiveHeaderMediaProps = {
2528
mediaCollection: MediaCollection[] | null;
2629
clickCallback?: () => void;
2730
};
@@ -36,11 +39,17 @@ const MemoizedMediaPlayer = memo(MediaLoader);
3639
const LiveHeaderMedia = ({
3740
mediaCollection,
3841
clickCallback = () => null,
39-
}: Props) => {
42+
}: LiveHeaderMediaProps) => {
4043
const { translations } = useContext(ServiceContext);
4144
const { isLite } = useContext(RequestContext);
4245
const [showMedia, setShowMedia] = useState(false);
4346

47+
const eventTrackingData: EventTrackingMetadata = {
48+
componentName: 'live-header-media',
49+
};
50+
const clickTrackerHandler = useClickTrackerHandler(eventTrackingData);
51+
const viewRef = useViewTracker(eventTrackingData);
52+
4453
let warningLevel = WARNING_LEVELS.NO_WARNING;
4554

4655
if (isLite || mediaCollection == null || mediaCollection.length === 0) {
@@ -83,7 +92,7 @@ const LiveHeaderMedia = ({
8392

8493
const titleHasPunctuation = short.slice(-1).match(regexPunctuationSymbols);
8594

86-
const handleClick = () => {
95+
const clickToggleMedia = () => {
8796
const mediaPlayer = window.mediaPlayers?.[vpid];
8897
if (showMedia) {
8998
mediaPlayer?.pause();
@@ -98,6 +107,11 @@ const LiveHeaderMedia = ({
98107
clickCallback();
99108
};
100109

110+
const handleClick = (e: React.MouseEvent<HTMLElement, MouseEvent>) => {
111+
clickTrackerHandler(e);
112+
clickToggleMedia();
113+
};
114+
101115
const description = (
102116
<>
103117
<Text
@@ -131,10 +145,10 @@ const LiveHeaderMedia = ({
131145
<p>{description}</p>
132146
<strong>{noJs}</strong>
133147
</noscript>
134-
<div css={styles.componentContainer}>
148+
<div css={styles.componentContainer} ref={viewRef}>
135149
<button
136150
type="button"
137-
onClick={() => handleClick()}
151+
onClick={e => handleClick(e)}
138152
data-testid="watch-now-close-button"
139153
className="focusIndicatorInvert"
140154
css={[

0 commit comments

Comments
 (0)