62 lines
2.3 KiB
JavaScript
62 lines
2.3 KiB
JavaScript
"use strict";
|
|
|
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.detectFocusVisible = detectFocusVisible;
|
|
exports.listenForFocusKeys = listenForFocusKeys;
|
|
|
|
var _keycode = _interopRequireDefault(require("keycode"));
|
|
|
|
var _warning = _interopRequireDefault(require("warning"));
|
|
|
|
var _contains = _interopRequireDefault(require("dom-helpers/query/contains"));
|
|
|
|
var _ownerDocument = _interopRequireDefault(require("dom-helpers/ownerDocument"));
|
|
|
|
// weak
|
|
var internal = {
|
|
focusKeyPressed: false,
|
|
keyUpEventTimeout: -1
|
|
};
|
|
|
|
function detectFocusVisible(instance, element, callback) {
|
|
var attempt = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;
|
|
process.env.NODE_ENV !== "production" ? (0, _warning.default)(instance.focusVisibleCheckTime, 'Material-UI: missing instance.focusVisibleCheckTime') : void 0;
|
|
process.env.NODE_ENV !== "production" ? (0, _warning.default)(instance.focusVisibleMaxCheckTimes, 'Material-UI: missing instance.focusVisibleMaxCheckTimes') : void 0;
|
|
instance.focusVisibleTimeout = setTimeout(function () {
|
|
var doc = (0, _ownerDocument.default)(element);
|
|
|
|
if (internal.focusKeyPressed && (doc.activeElement === element || (0, _contains.default)(element, doc.activeElement))) {
|
|
callback();
|
|
} else if (attempt < instance.focusVisibleMaxCheckTimes) {
|
|
detectFocusVisible(instance, element, callback, attempt + 1);
|
|
}
|
|
}, instance.focusVisibleCheckTime);
|
|
}
|
|
|
|
var FOCUS_KEYS = ['tab', 'enter', 'space', 'esc', 'up', 'down', 'left', 'right'];
|
|
|
|
function isFocusKey(event) {
|
|
return FOCUS_KEYS.indexOf((0, _keycode.default)(event)) !== -1;
|
|
}
|
|
|
|
var handleKeyUpEvent = function handleKeyUpEvent(event) {
|
|
if (isFocusKey(event)) {
|
|
internal.focusKeyPressed = true; // Let's consider that the user is using a keyboard during a window frame of 1s.
|
|
|
|
clearTimeout(internal.keyUpEventTimeout);
|
|
internal.keyUpEventTimeout = setTimeout(function () {
|
|
internal.focusKeyPressed = false;
|
|
}, 1e3);
|
|
}
|
|
};
|
|
|
|
function listenForFocusKeys(win) {
|
|
// The event listener will only be added once per window.
|
|
// Duplicate event listeners will be ignored by addEventListener.
|
|
// Also, this logic is client side only, we don't need a teardown.
|
|
win.addEventListener('keyup', handleKeyUpEvent);
|
|
} |