From 655be4404630a20ae4ca40c4af84afcc2e63557b Mon Sep 17 00:00:00 2001 From: Armand Philippot Date: Thu, 2 Nov 2023 15:36:21 +0100 Subject: refactor(hooks): replace useInputAutofocus with useAutofocus hook * extract setTimeout logic using useTimeout * change condition to be a function * return a ref --- src/utils/hooks/use-autofocus/use-autofocus.ts | 40 ++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/utils/hooks/use-autofocus/use-autofocus.ts (limited to 'src/utils/hooks/use-autofocus/use-autofocus.ts') diff --git a/src/utils/hooks/use-autofocus/use-autofocus.ts b/src/utils/hooks/use-autofocus/use-autofocus.ts new file mode 100644 index 0000000..0d21a59 --- /dev/null +++ b/src/utils/hooks/use-autofocus/use-autofocus.ts @@ -0,0 +1,40 @@ +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; +}; -- cgit v1.2.3