Hone logo
Hone
Problems

Create a useFocus Hook in React

This challenge asks you to build a custom React hook, useFocus, that manages focus on an HTML element. This hook is useful for automatically focusing an input field when a component mounts, or when certain conditions are met, improving user experience and accessibility. It provides a clean and reusable way to handle focus management within your React components.

Problem Description

You need to create a useFocus hook that accepts an optional dependency array. When the hook is first called (or when the dependencies change), it will automatically focus the provided ref. The hook should return a function that, when called, will focus the ref. This allows for manual focus control within the component.

What needs to be achieved:

  • Create a reusable useFocus hook.
  • The hook should accept a ref object (typically a ref created with useRef).
  • The hook should automatically focus the element referenced by the ref when the component mounts or when the dependencies change.
  • The hook should return a function that, when called, will focus the element referenced by the ref.

Key Requirements:

  • The hook must be written in TypeScript.
  • The hook must handle cases where the ref is initially null or undefined.
  • The hook should not cause errors if the ref is not attached to a valid DOM element.
  • The hook should correctly handle dependency changes, re-focusing the element when necessary.

Expected Behavior:

  • On initial mount, the element referenced by the ref should receive focus.
  • If the dependencies change, the element referenced by the ref should receive focus again.
  • Calling the returned function should focus the element referenced by the ref.
  • If the ref is not attached to a valid DOM element, no error should be thrown, and focus should not be attempted.

Edge Cases to Consider:

  • The ref is initially null or undefined.
  • The ref is attached to an element that is not visible (e.g., display: none).
  • The component unmounts before the ref is attached.
  • The element referenced by the ref is removed from the DOM.
  • The dependency array is empty.

Examples

Example 1:

Input: A component using the useFocus hook with an input ref and no dependencies.
Output: The input field receives focus on component mount.  Calling the returned focus function also focuses the input.
Explanation: The hook automatically focuses the input on mount and provides a function to manually focus it.

Example 2:

Input: A component using the useFocus hook with an input ref and a dependency array containing a boolean value.
Output: The input field receives focus on component mount and whenever the boolean value changes.
Explanation: The hook re-focuses the input whenever the dependency changes, allowing for conditional focus.

Example 3:

Input: A component using the useFocus hook with a ref that is initially null.
Output: No error is thrown. The element is focused when the ref is later attached.
Explanation: The hook gracefully handles the case where the ref is initially null.

Constraints

  • The hook must be written in TypeScript.
  • The hook should be compatible with React 18 or later.
  • The hook should not introduce any unnecessary dependencies.
  • The focus operation should be performed asynchronously to avoid blocking the main thread. (While not strictly required, it's good practice).

Notes

  • Consider using useEffect to manage the focus behavior.
  • The useRef hook is essential for creating the reference to the DOM element.
  • Think about how to handle the case where the ref is not yet attached to a DOM element when the effect runs.
  • The dependency array allows for conditional focus based on component state or props. Carefully consider what dependencies are necessary for your use case.
Loading editor...
typescript