/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import { useEffect } from 'react'; import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; export default function Root({ children }) { const { siteConfig } = useDocusaurusContext(); const { customFields } = siteConfig; useEffect(() => { const { matomoUrl, matomoSiteId } = customFields; if (typeof window !== 'undefined') { // Making testing easier, logging debug junk if we're in development const devMode = window.location.hostname === 'localhost' ? true : false; // Initialize the _paq array first window._paq = window._paq || []; // Configure the tracker before loading matomo.js window._paq.push(['enableHeartBeatTimer']); window._paq.push(['enableLinkTracking']); window._paq.push(['setTrackerUrl', `${matomoUrl}/matomo.php`]); window._paq.push(['setSiteId', matomoSiteId]); // Initial page view is handled by handleRouteChange // Now load the matomo.js script const script = document.createElement('script'); script.async = true; script.src = `${matomoUrl}/matomo.js`; document.head.appendChild(script); // Handle route changes for SPA const handleRouteChange = () => { if (devMode) { console.log('Route changed to:', window.location.pathname); } // Short timeout to ensure the page has fully rendered setTimeout(() => { // Get the current page title from the document const currentTitle = document.title; const currentPath = window.location.pathname; // For testing: impersonate real domain - ONLY FOR DEVELOPMENT if (devMode) { console.log('Tracking page view:', currentPath, currentTitle); window._paq.push(['setDomains', ['superset.apache.org']]); window._paq.push([ 'setCustomUrl', 'https://superset.apache.org' + currentPath, ]); } else { window._paq.push(['setCustomUrl', currentPath]); } window._paq.push(['setReferrerUrl', window.location.href]); window._paq.push(['setDocumentTitle', currentTitle]); window._paq.push(['trackPageView']); }, 100); // Increased delay to ensure page has fully rendered }; // Try all possible Docusaurus events - they've changed between versions const possibleEvents = [ 'docusaurus.routeDidUpdate', 'docusaurusRouteDidUpdate', 'routeDidUpdate', ]; if (devMode) { console.log('Setting up Docusaurus route listeners'); } possibleEvents.forEach(eventName => { document.addEventListener(eventName, () => { if (devMode) { console.log(`Docusaurus route update detected via ${eventName}`); } handleRouteChange(); }); }); // Also set up manual history tracking as fallback if (devMode) { console.log('Setting up manual history tracking as fallback'); } const originalPushState = window.history.pushState; window.history.pushState = function () { originalPushState.apply(this, arguments); handleRouteChange(); }; window.addEventListener('popstate', handleRouteChange); // Initial page tracking handleRouteChange(); return () => { // Cleanup listeners possibleEvents.forEach(eventName => { document.removeEventListener(eventName, handleRouteChange); }); if (originalPushState) { window.history.pushState = originalPushState; window.removeEventListener('popstate', handleRouteChange); } }; } }, []); return children; }