@guruhotel/aura-hooks
Version:
🪝 Hooks library designed by the Guruhotel team for Aura UI
1 lines • 1.02 kB
JavaScript
import{useCallback as e,useEffect as r,useRef as o}from"react";import{FOCUS_SELECTOR as t,focusable as n,tabbable as c}from"./tabbable";import{scopeTab as u}from"./scope-tab";import{createAriaHider as s}from"./create-aria-hider";export function useFocusTrap(i=!0){const l=o(),a=o(null),d=e((e=>{if(i)if(a.current&&a.current(),e){const r=r=>{a.current=s(r);let o=e.querySelector("[data-autofocus]");if(!o){const r=Array.from(e.querySelectorAll(t));o=r.find(c)||r.find(n)||null,!o&&n(e)&&(o=e)}o?o.focus({preventScroll:!0}):"development"===process.env.NODE_ENV&&console.warn("[useFocusTrap] Failed to find focusable element within provided node",e)};setTimeout((()=>{e.ownerDocument?r(e):"development"===process.env.NODE_ENV&&console.warn("[useFocusTrap] Ref node is not part of the dom",e)})),l.current=e}else l.current=null}),[i]);return r((()=>{if(!i)return;const e=e=>{"Tab"===e.key&&l.current&&u(l.current,e)};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}}),[i]),d}