rsuite
Version:
A suite of react components
31 lines (29 loc) • 1.06 kB
JavaScript
'use client';
import { useCallback, useRef } from 'react';
export function useFocus(elementRef) {
// When grabbing focus, keep track of previous activeElement
// so that we can return focus later
const previousActiveElementRef = useRef(null);
// Focus the element itself
const grab = useCallback(() => {
requestAnimationFrame(() => {
if (document.activeElement !== elementRef.current) {
var _elementRef$current;
previousActiveElementRef.current = document.activeElement;
(_elementRef$current = elementRef.current) === null || _elementRef$current === void 0 || _elementRef$current.focus();
}
});
}, [elementRef]);
// Return focus to previous active element
const release = useCallback(options => {
requestAnimationFrame(() => {
var _previousActiveElemen;
(_previousActiveElemen = previousActiveElementRef.current) === null || _previousActiveElemen === void 0 || _previousActiveElemen.focus(options);
});
}, []);
return {
grab,
release
};
}
export default useFocus;