'use client'; import { useEffect, useRef } from 'react'; import { usePathname } from 'next/navigation'; import { useAnalytics } from './useAnalytics'; import { AnalyticsEvents } from './analytics-events'; /** * ScrollDepthTracker * Tracks user scroll progress across pages. * Fires events at 25%, 50%, 75%, and 100% depth. */ export default function ScrollDepthTracker() { const pathname = usePathname(); const { trackEvent } = useAnalytics(); const trackedDepths = useRef>(new Set()); // Reset tracking when path changes useEffect(() => { trackedDepths.current.clear(); }, [pathname]); useEffect(() => { const handleScroll = () => { const scrollY = window.scrollY; const windowHeight = window.innerHeight; const documentHeight = document.documentElement.scrollHeight; // Calculate how far the user has scrolled in percentage // documentHeight - windowHeight is the total scrollable distance const totalScrollable = documentHeight - windowHeight; if (totalScrollable <= 0) return; // Not scrollable const scrollPercentage = Math.round((scrollY / totalScrollable) * 100); // We only care about specific milestones const milestones = [25, 50, 75, 100]; milestones.forEach((milestone) => { if (scrollPercentage >= milestone && !trackedDepths.current.has(milestone)) { trackedDepths.current.add(milestone); trackEvent(AnalyticsEvents.SCROLL_DEPTH, { depth: milestone, path: pathname, }); } }); }; // Use passive listener for better performance window.addEventListener('scroll', handleScroll, { passive: true }); // Initial check (in case page is short or already scrolled) handleScroll(); return () => { window.removeEventListener('scroll', handleScroll); }; }, [pathname, trackEvent]); return null; }