useAccessibility.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. "use strict";
  2. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  3. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = useAccessibility;
  8. var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode"));
  9. var _raf = _interopRequireDefault(require("rc-util/lib/raf"));
  10. var React = _interopRequireWildcard(require("react"));
  11. var ESC = _KeyCode.default.ESC,
  12. TAB = _KeyCode.default.TAB;
  13. function useAccessibility(_ref) {
  14. var visible = _ref.visible,
  15. triggerRef = _ref.triggerRef,
  16. onVisibleChange = _ref.onVisibleChange,
  17. autoFocus = _ref.autoFocus,
  18. overlayRef = _ref.overlayRef;
  19. var focusMenuRef = React.useRef(false);
  20. var handleCloseMenuAndReturnFocus = function handleCloseMenuAndReturnFocus() {
  21. if (visible) {
  22. var _triggerRef$current, _triggerRef$current$f;
  23. (_triggerRef$current = triggerRef.current) === null || _triggerRef$current === void 0 || (_triggerRef$current$f = _triggerRef$current.focus) === null || _triggerRef$current$f === void 0 || _triggerRef$current$f.call(_triggerRef$current);
  24. onVisibleChange === null || onVisibleChange === void 0 || onVisibleChange(false);
  25. }
  26. };
  27. var focusMenu = function focusMenu() {
  28. var _overlayRef$current;
  29. if ((_overlayRef$current = overlayRef.current) !== null && _overlayRef$current !== void 0 && _overlayRef$current.focus) {
  30. overlayRef.current.focus();
  31. focusMenuRef.current = true;
  32. return true;
  33. }
  34. return false;
  35. };
  36. var handleKeyDown = function handleKeyDown(event) {
  37. switch (event.keyCode) {
  38. case ESC:
  39. handleCloseMenuAndReturnFocus();
  40. break;
  41. case TAB:
  42. {
  43. var focusResult = false;
  44. if (!focusMenuRef.current) {
  45. focusResult = focusMenu();
  46. }
  47. if (focusResult) {
  48. event.preventDefault();
  49. } else {
  50. handleCloseMenuAndReturnFocus();
  51. }
  52. break;
  53. }
  54. }
  55. };
  56. React.useEffect(function () {
  57. if (visible) {
  58. window.addEventListener("keydown", handleKeyDown);
  59. if (autoFocus) {
  60. // FIXME: hack with raf
  61. (0, _raf.default)(focusMenu, 3);
  62. }
  63. return function () {
  64. window.removeEventListener("keydown", handleKeyDown);
  65. focusMenuRef.current = false;
  66. };
  67. }
  68. return function () {
  69. focusMenuRef.current = false;
  70. };
  71. }, [visible]); // eslint-disable-line react-hooks/exhaustive-deps
  72. }