@kiwicom/orbit-components
Version:
Orbit-components is a React component library which provides developers with the easiest possible way of building Kiwi.com’s products.
68 lines (54 loc) • 1.84 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
exports.__esModule = true;
exports.default = void 0;
var React = _interopRequireWildcard(require("react"));
var _consts = _interopRequireDefault(require("./consts"));
var _keyMaps = _interopRequireDefault(require("../../common/keyMaps"));
const manageFocus = (ref, triggered) => {
if (triggered && ref.current) {
const focusableElements = ref.current.querySelectorAll(_consts.default);
if (focusableElements.length > 0) {
const firstFocusableEl = focusableElements[0];
const lastFocusableEl = focusableElements[focusableElements.length - 1];
return {
first: firstFocusableEl,
last: lastFocusableEl
};
}
}
return {
first: null,
last: null
};
};
const useFocusTrap = ref => {
const [triggered, setTriggered] = React.useState(false);
React.useEffect(() => {
const handleKeyDown = ev => {
if (ev.keyCode === _keyMaps.default.TAB) {
if (!triggered) {
setTriggered(true);
}
const {
first,
last
} = manageFocus(ref, triggered);
if (ev.shiftKey && last && (document.activeElement === first || document.activeElement === ref.current)) {
ev.preventDefault();
last.focus();
} else if (!ev.shiftKey && first && document.activeElement === last) {
ev.preventDefault();
first.focus();
}
}
};
document.addEventListener("keydown", handleKeyDown);
return () => {
document.removeEventListener("keydown", handleKeyDown);
};
}, [triggered, ref]);
};
var _default = useFocusTrap;
exports.default = _default;