import { useCallback, useRef, type MutableRefObject } from 'react'; import { useTimeout } from '../use-timeout'; export type UseAutofocusCondition = () => boolean; export type UseAutofocusConfig = { /** * A condition to met before giving focus to the element. */ condition?: UseAutofocusCondition; /** * A delay in ms before giving focus to the element. */ delay?: number; }; /** * React hook to give focus to an element automatically. * * @param {UseAutofocusConfig} [config] - A configuration object. * @returns {RefObject} The element reference. */ export const useAutofocus = ( config?: UseAutofocusConfig ): MutableRefObject => { const { condition, delay } = config ?? {}; const ref = useRef(null); const setFocus = useCallback(() => { const shouldFocus = condition ? condition() : true; if (ref.current && shouldFocus) { ref.current.focus(); } }, [condition]); useTimeout(setFocus, delay); return ref; };