DocsCloud UI HooksuseFocusReturn

useFocusReturn

Automatically returns focus to the last focused element when a given condition is met.

Import

import { useFocusReturn } from '@tidbcloud/uikit'

Usage

useFocusReturn is used to restore focus after a modal, drawer, or similar overlay was closed.

import { useFocusReturn } from '@tidbcloud/uikit'
 
function Demo() {
  const [opened, setOpened] = useState(false)
 
  useFocusReturn({
    opened,
    shouldReturnFocus: true
  })
 
  return (
    <>
      <button onClick={() => setOpened(true)}>Open</button>
      {opened && (
        <div>
          <button onClick={() => setOpened(false)}>Close</button>
        </div>
      )}
    </>
  )
}

With useFocusTrap

In most cases, you should use this hook with useFocusTrap:

import { useFocusReturn, useFocusTrap, useMergedRef } from '@tidbcloud/uikit'
 
function Demo() {
  const [opened, setOpened] = useState(false)
  const focusTrapRef = useFocusTrap(opened)
 
  useFocusReturn({
    opened,
    shouldReturnFocus: true
  })
 
  return (
    <>
      <button onClick={() => setOpened(true)}>Open</button>
      {opened && (
        <div ref={focusTrapRef}>
          <input />
          <button onClick={() => setOpened(false)}>Close</button>
        </div>
      )}
    </>
  )
}

Manual Focus Return

If shouldReturnFocus is set to false, you can call the returned function to focus last active element:

import { useFocusReturn } from '@tidbcloud/uikit'
 
const returnFocus = useFocusReturn({
  opened: false,
  shouldReturnFocus: false
})
 
// Later...
returnFocus()

Definition

interface UseFocusReturnOptions {
  opened: boolean
  shouldReturnFocus?: boolean
}
 
function useFocusReturn(options: UseFocusReturnOptions): () => void