use_once_callback/index.jsx

import { useEffect, useRef } from 'react';
import useStableCallback from '../use_stable_callback';

/**
 * @param {function} fn function to be called once
 * @param {any[]} resetDeps array of dependencies for resetting 'once' state
 * @returns {function} callback with stable identity
 */
const useOnceCallback = (fn, resetDeps = []) => {
  const wasCalledRef = useRef(false);

  useEffect(() => {
    wasCalledRef.current = false;
  }, resetDeps);

  return useStableCallback((...args) => {
    if (wasCalledRef.current) return;

    fn(...args);
    wasCalledRef.current = true;
  });
};

export default useOnceCallback;