(function() {
  const { useState, useEffect } = React;

  function useCounter(targets, duration = 2200, delay = 600) {
    const [counts, setCounts] = useState(
      Object.fromEntries(Object.keys(targets).map(k => [k, 0]))
    );

    useEffect(() => {
      const timer = setTimeout(() => {
        const start = Date.now();
        function tick() {
          const p    = Math.min(1, (Date.now() - start) / duration);
          const ease = 1 - Math.pow(1 - p, 3);
          setCounts(
            Object.fromEntries(
              Object.entries(targets).map(([k, v]) => [k, Math.round(v * ease)])
            )
          );
          if (p < 1) requestAnimationFrame(tick);
        }
        requestAnimationFrame(tick);
      }, delay);
      return () => clearTimeout(timer);
    }, []);

    return counts;
  }

  window.useCounter = useCounter;
})();
