@atlaskit/navigation-system
Version:
The latest navigation system for Atlassian apps.
157 lines (154 loc) • 8.93 kB
JavaScript
/* top-nav-end.tsx generated by @compiled/babel-plugin v3.0.2 */
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.TopNavEnd = TopNavEnd;
require("./top-nav-end.compiled.css");
var _runtime = require("@compiled/react/runtime");
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = _interopRequireWildcard(require("react"));
var _react2 = require("@compiled/react");
var _mergeRefs = _interopRequireDefault(require("@atlaskit/ds-lib/merge-refs"));
var _useLayoutEffect = require("@atlaskit/ds-lib/use-layout-effect");
var _showMoreHorizontal = _interopRequireDefault(require("@atlaskit/icon/core/show-more-horizontal"));
var _openLayerObserverNamespaceProvider = require("@atlaskit/layering/open-layer-observer-namespace-provider");
var _fg = require("@atlaskit/platform-feature-flags/fg");
var _popup = require("@atlaskit/popup/popup");
var _useMediaQuery = require("@atlaskit/primitives/compiled/use-media-query");
var _list = require("../../../components/list");
var _hasCustomThemeContext = require("../../top-nav-items/themed/has-custom-theme-context");
var _iconButton = require("../../top-nav-items/themed/icon-button");
var _constants = require("../constants");
var _useTopNavBreakpoints = require("./use-top-nav-breakpoints");
var _useTopNavEndFocus2 = require("./use-top-nav-end-focus");
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
// Compiled supports the inherited container-layout widths outside @atlaskit/css's bounded values.
var containerStyles = {
focusScope: "_1e0c1bgi",
root: "_yyhy11wp _1e0c1txw _1bahh9n0 _1ul9zwfg",
withPersistentItems: "_zulpu2gc _4cvr1h6o",
container: "_1bsb14ik _1ul98ox3 _vchhusvi _10fph9n0 _1d2yioy8 _gltexl30 _15riwpqv",
viewport: "_1d2y1ris _glte1ris _15rip2n4 _1gs5usvi _ndwch9n0"
};
var listStyles = {
root: "_zulp1b66 _4cvr1h6o _1e0c1txw",
container: "_1e0c1cgg _181nz5ha",
hideOnSmallViewport: "_1e0cglyw _181n1txw",
popupContainer: "_1yt4u2gc"
};
/**
* __TopNavEnd__
*
* Wrapper for the top navigation actions on the inline-end (right) side of the top navigation.
*
* On small viewports, the children will be placed inside a popup, and a button will be rendered to open the popup.
* This is to prevent the actions from overflowing the top navigation.
*/
function TopNavEnd(_ref) {
var _breakpoints$belowSm;
var children = _ref.children,
persistentItems = _ref.persistentItems,
_ref$label = _ref.label,
label = _ref$label === void 0 ? 'Actions' : _ref$label,
_ref$showMoreButtonLa = _ref.showMoreButtonLabel,
showMoreButtonLabel = _ref$showMoreButtonLa === void 0 ? 'Show more' : _ref$showMoreButtonLa;
var breakpoints = (0, _useTopNavBreakpoints.useTopNavBreakpoints)();
var hasContainerBreakpoints = breakpoints != null;
var hasPersistentItems = (0, _fg.fg)('platform-dst-chat-panel-layout') && persistentItems != null;
var _useState = (0, _react.useState)(false),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
isOpen = _useState2[0],
setIsOpen = _useState2[1];
// Always setting to `false` for the initial render (will flip in an effect for mobile)
var _useState3 = (0, _react.useState)(false),
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
isMobileViewport = _useState4[0],
setIsMobileViewport = _useState4[1];
// Note: `query` is a stable value between renders
var query = (0, _useMediaQuery.UNSAFE_useMediaQuery)('below.sm', function onChange(event) {
setIsMobileViewport(event.matches);
// Container mode closes only when the effective layout changes below.
// Keep the existing viewport behavior outside the rollout / provider.
if ((0, _fg.fg)('platform-dst-chat-panel-layout')) {
if (!hasContainerBreakpoints) {
setIsOpen(false);
}
} else {
setIsOpen(false);
}
});
(0, _useLayoutEffect.useLayoutEffect)(function () {
var _query$matches;
// The default is `false`, and desktop will remain as `false` (no re-render).
// Mobile will flip from `false` to `true`.
setIsMobileViewport((_query$matches = query === null || query === void 0 ? void 0 : query.matches) !== null && _query$matches !== void 0 ? _query$matches : false);
}, [query]);
var isMobile = (_breakpoints$belowSm = breakpoints === null || breakpoints === void 0 ? void 0 : breakpoints.belowSm) !== null && _breakpoints$belowSm !== void 0 ? _breakpoints$belowSm : isMobileViewport;
var _useTopNavEndFocus = (0, _useTopNavEndFocus2.useTopNavEndFocus)({
isMobile: isMobile,
enabled: (0, _fg.fg)('platform-dst-chat-panel-layout')
}),
actionsRef = _useTopNavEndFocus.actionsRef,
triggerRef = _useTopNavEndFocus.triggerRef,
onFocusCapture = _useTopNavEndFocus.onFocusCapture;
(0, _useLayoutEffect.useLayoutEffect)(function () {
if ((0, _fg.fg)('platform-dst-chat-panel-layout') && hasContainerBreakpoints) {
setIsOpen(false);
}
}, [isMobile, hasContainerBreakpoints]);
// The shared provider also covers the mobile overflow popup itself. Keep the
// previous content-only namespace coverage when the layout gate is disabled.
// The observer is not used when the top-layer gate is on, so no provider is needed.
var actions = (0, _fg.fg)('platform-dst-chat-panel-layout') || (0, _fg.fg)('platform-dst-top-layer') ? children : /*#__PURE__*/_react.default.createElement(_openLayerObserverNamespaceProvider.OpenLayerObserverNamespaceProvider, {
namespace: _constants.openLayerObserverTopNavEndNamespace
}, children);
var regularActions = isMobile ? /*#__PURE__*/_react.default.createElement(_popup.Popup, {
isOpen: isOpen,
onClose: function onClose() {
return setIsOpen(false);
}
// Top-layer popups need a role to register as a popup with the layer observer.
,
role: (0, _fg.fg)('platform-dst-chat-panel-layout') ? 'dialog' : undefined,
label: (0, _fg.fg)('platform-dst-chat-panel-layout') ? label : undefined,
placement: "bottom-start",
shouldRenderToParent: true,
content: function content() {
return /*#__PURE__*/_react.default.createElement(_hasCustomThemeContext.HasCustomThemeContext.Provider, {
value: false
}, /*#__PURE__*/_react.default.createElement(_list.List, {
ref: actionsRef,
xcss: (0, _react2.cx)(listStyles.root, listStyles.popupContainer)
}, actions));
},
trigger: function trigger(triggerProps) {
return /*#__PURE__*/_react.default.createElement(_iconButton.IconButton, (0, _extends2.default)({}, triggerProps, {
ref: (0, _fg.fg)('platform-dst-chat-panel-layout') ? (0, _mergeRefs.default)([triggerProps.ref, triggerRef]) : triggerProps.ref,
label: showMoreButtonLabel,
isSelected: isOpen,
onClick: function onClick() {
return setIsOpen(!isOpen);
},
icon: _showMoreHorizontal.default,
isTooltipDisabled: false
}));
}
}) : /*#__PURE__*/_react.default.createElement(_list.List, {
ref: actionsRef,
xcss: (0, _react2.cx)(listStyles.root, (0, _fg.fg)('platform-dst-chat-panel-layout') ? listStyles.container : listStyles.hideOnSmallViewport)
}, actions);
var content = /*#__PURE__*/_react.default.createElement("nav", {
"aria-label": label,
className: (0, _runtime.ax)([containerStyles.root, (0, _fg.fg)('platform-dst-chat-panel-layout') ? containerStyles.container : containerStyles.viewport, hasPersistentItems && containerStyles.withPersistentItems])
}, (0, _fg.fg)('platform-dst-chat-panel-layout') ? /*#__PURE__*/_react.default.createElement("div", {
onFocusCapture: onFocusCapture,
className: (0, _runtime.ax)([containerStyles.focusScope])
}, regularActions) : regularActions, hasPersistentItems && persistentItems);
return (0, _fg.fg)('platform-dst-chat-panel-layout') && !(0, _fg.fg)('platform-dst-top-layer') ? /*#__PURE__*/_react.default.createElement(_openLayerObserverNamespaceProvider.OpenLayerObserverNamespaceProvider, {
namespace: _constants.openLayerObserverTopNavEndNamespace
}, content) : content;
}