All checks were successful
Build & Deploy / 🔍 Prepare (push) Successful in 23s
Build & Deploy / 🧪 QA (push) Successful in 2m1s
Build & Deploy / 🏗️ Build (push) Successful in 7m43s
Build & Deploy / 🚀 Deploy (push) Successful in 26s
Build & Deploy / 🧪 Smoke Test (push) Successful in 1m10s
Build & Deploy / ⚡ Lighthouse (push) Successful in 3m20s
Build & Deploy / 🔔 Notify (push) Successful in 2s
35 lines
980 B
TypeScript
35 lines
980 B
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,
|
|
});
|
|
|
|
export default function AnalyticsShell() {
|
|
const [shouldLoad, setShouldLoad] = useState(false);
|
|
|
|
useEffect(() => {
|
|
// 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 />
|
|
</Suspense>
|
|
);
|
|
}
|