@atlaskit/navigation-system
Version:
The latest navigation system for Atlassian apps.
68 lines (66 loc) • 3.07 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useSideNavToggleKeyboardShortcut = useSideNavToggleKeyboardShortcut;
var _react = require("react");
var _bindEventListener = require("bind-event-listener");
var _useStableRef = _interopRequireDefault(require("@atlaskit/ds-lib/use-stable-ref"));
var _useOpenLayerObserver = require("@atlaskit/layering/use-open-layer-observer");
var _fg = require("@atlaskit/platform-feature-flags/fg");
var _hasOpenDialogOrPopover = require("@atlaskit/top-layer/page-surface/has-open-dialog-or-popover");
var _requestClosePopovers = require("@atlaskit/top-layer/page-surface/request-close-popovers");
var _useIsSideNavShortcutEnabled = require("./use-is-side-nav-shortcut-enabled");
var _useToggleSideNav = require("./use-toggle-side-nav");
/**
* Binds the keyboard shortcut to toggle the side nav.
*/
function useSideNavToggleKeyboardShortcut(_ref) {
var canToggleWithShortcut = _ref.canToggleWithShortcut;
var openLayerObserver = (0, _useOpenLayerObserver.useOpenLayerObserver)({
isEnabled: !(0, _fg.fg)('platform-dst-top-layer')
});
var toggleVisibilityByShortcut = (0, _useToggleSideNav.useToggleSideNav)({
trigger: 'keyboard'
});
var canToggleWithShortcutStableRef = (0, _useStableRef.default)(canToggleWithShortcut);
var isSideNavShortcutEnabled = (0, _useIsSideNavShortcutEnabled.useIsSideNavShortcutEnabled)();
(0, _react.useEffect)(function () {
if (!isSideNavShortcutEnabled) {
return;
}
return (0, _bindEventListener.bind)(window, {
type: 'keydown',
listener: function listener(event) {
if (event.ctrlKey && event.key === '[') {
if (canToggleWithShortcutStableRef.current && !canToggleWithShortcutStableRef.current()) {
// Return early if the callback returns false.
// If the callback is not provided, we assume the shortcut is enabled.
return;
}
if (event.repeat) {
// Ignore repeated keydown events from holding down the keys
return;
}
if ((0, _fg.fg)('platform-dst-top-layer') && (0, _hasOpenDialogOrPopover.hasOpenDialogOrPopover)({
type: 'modal'
})) {
// Return early if there are any open modal dialogs
return;
}
if (openLayerObserver && openLayerObserver.getCount({
type: 'modal'
}) > 0) {
// Return early if there are any open modals
return;
}
// Not gated. Top-layer tooltips (`platform-dst-top-layer-tooltip`) are not known to the observer.
(0, _requestClosePopovers.requestClosePopovers)();
openLayerObserver === null || openLayerObserver === void 0 || openLayerObserver.closeLayers();
toggleVisibilityByShortcut();
}
}
});
}, [canToggleWithShortcutStableRef, isSideNavShortcutEnabled, openLayerObserver, toggleVisibilityByShortcut]);
}