Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 8s
Build & Deploy / 🧪 QA (push) Successful in 2m25s
Build & Deploy / 🏗️ Build (push) Successful in 3m59s
Build & Deploy / 🚀 Deploy (push) Successful in 15s
Build & Deploy / 🧪 Post-Deploy Verification (push) Successful in 4m55s
Build & Deploy / 🔔 Notify (push) Successful in 2s
Nightly QA / call-qa-workflow (push) Failing after 45s
- Add WebVitalsTracker component using useReportWebVitals - Report LCP, CLS, FID, FCP, TTFB, and INP as Umami events - Include rating (good/needs-improvement/poor) for meaningful metrics
44 lines
1.2 KiB
TypeScript
44 lines
1.2 KiB
TypeScript
'use client';
|
|
|
|
import dynamic from 'next/dynamic';
|
|
import { Suspense, useEffect, useState } from 'react';
|
|
|
|
const DynamicAnalyticsProvider = dynamic(() => import('./AnalyticsProvider'), {
|
|
ssr: false,
|
|
});
|
|
const DynamicScrollDepthTracker = dynamic(() => import('./ScrollDepthTracker'), {
|
|
ssr: false,
|
|
});
|
|
const DynamicWebVitalsTracker = dynamic(() => import('./WebVitalsTracker'), {
|
|
ssr: false,
|
|
});
|
|
|
|
export default function AnalyticsShell() {
|
|
const [shouldLoad, setShouldLoad] = useState(false);
|
|
|
|
useEffect(() => {
|
|
// Disable analytics in CI to prevent console noise/score penalties
|
|
if (process.env.NEXT_PUBLIC_CI === 'true') {
|
|
return;
|
|
}
|
|
|
|
// Wait until browser is completely idle before loading heavy analytics/logger/sentry SDKs
|
|
if (typeof window !== 'undefined' && 'requestIdleCallback' in window) {
|
|
window.requestIdleCallback(() => setShouldLoad(true), { timeout: 3000 });
|
|
} else {
|
|
const timer = setTimeout(() => setShouldLoad(true), 2500);
|
|
return () => clearTimeout(timer);
|
|
}
|
|
}, []);
|
|
|
|
if (!shouldLoad) return null;
|
|
|
|
return (
|
|
<Suspense fallback={null}>
|
|
<DynamicAnalyticsProvider />
|
|
<DynamicScrollDepthTracker />
|
|
<DynamicWebVitalsTracker />
|
|
</Suspense>
|
|
);
|
|
}
|