UNPKG

@atlaskit/navigation-system

Version:

The latest navigation system for Atlassian apps.

157 lines (154 loc) • 8.93 kB
/* 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; }