@adyen/adyen-platform-experience-web
Version:

65 lines (64 loc) • 2.46 kB
JavaScript
import { useRef as u, useMemo as i, useCallback as l } from "../../external/preact/hooks/dist/hooks.module.js";
import { InteractionKeyCode as r } from "../../components/types.js";
import { withTabbableRoot as T, isFocusable as p, focusIsWithin as L } from "../../primitives/dom/tabbableRoot/tabbable.js";
import C from "../useReflex.js";
import { isUndefined as O } from "../../utils/value/is.js";
const w = (R, f) => {
const s = u(!1), o = u(null), c = u(!1), a = i(T, []), m = i(() => {
let e = null, t;
return (F) => {
O(t) || cancelAnimationFrame(t);
let n = F.target;
for (; n && n !== F.currentTarget; ) {
if (p(n)) {
e = n, t = requestAnimationFrame(() => {
t = requestAnimationFrame(() => {
var b;
o.current !== e && e instanceof HTMLElement && ((b = o.current = e) == null || b.focus()), e = null, t = void 0;
});
});
return;
}
n = n.parentNode;
}
};
}, []), d = l((e) => {
a.current = o.current = e.target;
}, []), E = l((e) => {
a.tabbables.includes(e.relatedTarget) || L(e.currentTarget, e.relatedTarget) || c.current || (s.current = !0, requestAnimationFrame(() => {
s.current && f(s.current = !1);
}));
}, []), A = i(() => {
let e;
return (t) => {
switch (t.code) {
case r.ARROW_DOWN:
case r.ARROW_LEFT:
case r.ARROW_RIGHT:
case r.ARROW_UP:
case r.END:
case r.ESCAPE:
case r.HOME:
case r.PAGE_DOWN:
case r.PAGE_UP:
case r.TAB:
cancelAnimationFrame(e), e = requestAnimationFrame(() => {
e = requestAnimationFrame(() => {
c.current = !1, e = void 0;
});
}), c.current = !0;
break;
}
t.code === r.TAB ? (t.preventDefault(), a.current = t.shiftKey ? -1 : 1) : t.code === r.ESCAPE && f(!0);
};
}, []);
return C(
l((e, t) => {
t instanceof Element && (t.removeEventListener("keydown", A, !0), t.removeEventListener("focusin", d, !0), t.removeEventListener("focusout", E, !0), e.removeEventListener("click", m, !0)), e instanceof Element ? (e.addEventListener("keydown", A, !0), e.addEventListener("focusin", d, !0), e.addEventListener("focusout", E, !0), e.addEventListener("click", m, !0), s.current = !1, a.root = e) : a.root = null;
}, []),
R
);
};
export {
w as default
};