client/utilities/hooks/useAnalytics.ts (53 lines of code) (raw):
import { loadScript } from '@guardian/libs';
import * as Sentry from '@sentry/browser';
import { useEffect, useState } from 'react';
import { useLocation } from 'react-router-dom';
export const useAnalytics = () => {
const location = useLocation();
const [cmpIsInitialised, setCmpIsInitialised] = useState<boolean>(false);
const [qmIsInitialised, setQmIsInitialised] = useState<boolean>(false);
const initialiseQm = () => {
loadScript(
'https://cdn.quantummetric.com/instrumentation/1.35.4/quantum-gnm.js',
{
async: true,
integrity:
'sha384-VMLIC70VzACtZAEkPaL+7xW+v0+UjkIUuGxlArtIG+Pzqlp5DkbfVG9tRm75Liwx',
crossOrigin: 'anonymous',
},
)
.then(() => {
setQmIsInitialised(true);
})
.catch(() => {
Sentry.captureException('Failed to load Quantum Metric');
});
};
useEffect(() => {
import('@guardian/libs').then(({ onConsentChange, getConsentFor }) => {
onConsentChange((consentState) => {
const qmConsentState = getConsentFor('qm', consentState);
if (qmConsentState && !qmIsInitialised) {
initialiseQm();
}
setCmpIsInitialised(true);
});
});
}, [qmIsInitialised]);
useEffect(() => {
if (!cmpIsInitialised) {
return;
}
if (
window.guardian &&
window.guardian.ophan &&
window.guardian.ophan.sendInitialEvent
) {
if (window.guardian.spaTransition) {
window.guardian.ophan.sendInitialEvent(window.location.href);
} else {
// tslint:disable-next-line:no-object-mutation
window.guardian.spaTransition = true;
}
}
}, [location, cmpIsInitialised]);
};