Web Totals

useDelayedState

const emptyFunction = (...args) => {};

const useDelayedState = (initialValues) => {
  const [value, setValue] = useState(initialValues);
  const e = useRef(null);

  useEffect(function () {
    return function () {
      return clearTimeout(e.current);
    };
  }, []);

  const func = useCallback(function (a, c = 0, f = emptyFunction) {
    clearTimeout(e.current);
    e.current = null;

    if (c === 0) {
      setValue(a), f(a);
    } else {
      e.current = setTimeout(() => {
        setValue(a), f(a);
        e.current = null;
      }, c);
    }
  }, []);

  return [value, func];
};

const App = () => {
  const [v, setV] = useDelayedState(0);

  return (
    <div>
      <button onClick={() => setV(v + 1, 1000)}>Click {v}</button>
    </div>
  );
};

render(<App />);
jsx