import { useEffect, useRef, useState } from "react"; export default function Counter({ end, duration }) { const [count, setCount] = useState(0); const countRef = useRef(null); const increment = end / duration; useEffect(() => { const observer = new IntersectionObserver( ([entry]) => { if (entry.isIntersecting) { startCount(); observer.disconnect(); } }, { threshold: 0 } ); if (countRef.current) { observer.observe(countRef.current); } return () => { observer.disconnect(); }; }, []); useEffect(() => { const interval = setInterval(() => { setCount((prevCount) => { const newCount = prevCount + increment; if (newCount >= end) { clearInterval(interval); return end; } else { return newCount; } }); }, 1000 / duration); return () => { clearInterval(interval); }; }, [end, increment]); const startCount = () => { setCount(0); }; return ( {Math.round(count)} ); }