From a18a1636a433c67c040a7abccab06643c71ffac9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Maro=C5=A1i?= Date: Tue, 13 Jun 2023 12:58:13 +0200 Subject: [PATCH] Ensure analytics observer instance is not lost. --- src/analytics/SegmentProvider.tsx | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/analytics/SegmentProvider.tsx b/src/analytics/SegmentProvider.tsx index 0edf5293d..8e1c30d4f 100644 --- a/src/analytics/SegmentProvider.tsx +++ b/src/analytics/SegmentProvider.tsx @@ -75,7 +75,12 @@ const getAPIKey = (env: SegmentEnvs = 'dev', module: SegmentModules, moduleAPIKe }[env]?.[module] || KEY_FALLBACK[env]; +let observer: MutationObserver | undefined; const registerAnalyticsObserver = () => { + // never override the observer + if (observer) { + return; + } /** * We ignore hash changes * Hashes only have frontend effect @@ -83,7 +88,7 @@ const registerAnalyticsObserver = () => { let oldHref = document.location.href.replace(/#.*$/, ''); const bodyList = document.body; - const observer = new MutationObserver((mutations) => { + observer = new MutationObserver((mutations) => { mutations.forEach(() => { const newLocation = document.location.href.replace(/#.*$/, ''); if (oldHref !== newLocation) { @@ -99,7 +104,6 @@ const registerAnalyticsObserver = () => { childList: true, subtree: true, }); - return observer.disconnect; }; const isInternal = (email = '') => /@(redhat\.com|.*ibm\.com)$/gi.test(email); @@ -255,8 +259,11 @@ const SegmentProvider: React.FC = ({ activeModule, childre }; useEffect(() => { - const disconnect = registerAnalyticsObserver(); - return () => disconnect(); + registerAnalyticsObserver(); + return () => { + observer?.disconnect(); + observer = undefined; + }; }, []); useEffect(() => {