UNPKG

baseui

Version:

A React Component library implementing the Base design language

141 lines (137 loc) • 5.91 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = UserMenuComponent; var React = _interopRequireWildcard(require("react")); var _avatar = require("../avatar"); var _button = require("../button"); var _overrides = require("../helpers/overrides"); var _chevronDown = _interopRequireDefault(require("../icon/chevron-down")); var _chevronUp = _interopRequireDefault(require("../icon/chevron-up")); var _list = require("../list"); var _menu = require("../menu"); var _popover = require("../popover"); var _styledComponents = require("./styled-components"); var _userProfileTile = _interopRequireDefault(require("./user-profile-tile")); var _utils = require("./utils"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } /* Copyright (c) Uber Technologies, Inc. This source code is licensed under the MIT license found in the LICENSE file in the root directory of this source tree. */ const MENU_ITEM_WIDTH = '275px'; // eslint-disable-next-line @typescript-eslint/no-explicit-any,react/display-name const UserMenuListItem = /*#__PURE__*/React.forwardRef((props, ref) => { const { item, mapItemToNode = _utils.defaultMapItemToNode } = props; // Replace with a user menu item renderer return /*#__PURE__*/React.createElement(_list.MenuAdapter, _extends({}, props, { ref: ref, artwork: item.icon || null, artworkSize: _list.ARTWORK_SIZES.LARGE }), /*#__PURE__*/React.createElement(_list.ListItemLabel, null, mapItemToNode(item))); }); // @ts-ignore const svgStyleOverride = ({ $theme }) => ({ paddingLeft: $theme.sizing.scale200 }); function UserMenuComponent(props) { // isOpen is used for displaying different arrow icons in open or closed state const [isOpen, setIsOpen] = React.useState(false); const { userItems = [], username, userImgUrl, overrides = {} } = props; const [UserMenuProfileListItem, userMenuProfileListItemProps] = (0, _overrides.getOverrides)(overrides.UserMenuProfileListItem, _styledComponents.StyledUserMenuProfileListItem); const [UserMenuButton, userMenuButtonProps] = (0, _overrides.getOverrides)(overrides.UserMenuButton, _button.Button); userMenuButtonProps.overrides = (0, _overrides.mergeOverrides)({ BaseButton: { component: _styledComponents.StyledUserMenuButton } }, userMenuButtonProps.overrides); const [UserMenu, userMenuProps] = (0, _overrides.getOverrides)(overrides.UserMenu, _menu.StatefulMenu); userMenuProps.overrides = (0, _overrides.mergeOverrides)({ List: { // eslint-disable-next-line react/display-name component: /*#__PURE__*/React.forwardRef(({ children, ...restProps }, ref) => /*#__PURE__*/React.createElement(_menu.StyledList, _extends({}, restProps, { ref: ref }), /*#__PURE__*/React.createElement(UserMenuProfileListItem, userMenuProfileListItemProps, /*#__PURE__*/React.createElement(_userProfileTile.default, { username: props.username, usernameSubtitle: props.usernameSubtitle, userImgUrl: props.userImgUrl, overrides: overrides })), children)), style: { width: MENU_ITEM_WIDTH } }, // eslint-disable-next-line react/display-name ListItem: /*#__PURE__*/React.forwardRef((listItemProps, ref) => { return /*#__PURE__*/React.createElement(UserMenuListItem, _extends({ ref: ref }, listItemProps, { mapItemToNode: props.mapItemToNode })); }) }, userMenuProps.overrides); return /*#__PURE__*/React.createElement(_popover.StatefulPopover, { content: ({ close }) => /*#__PURE__*/React.createElement(UserMenu, _extends({ items: userItems // @ts-ignore , onItemSelect: ({ item }) => { props.onItemSelect(item); close(); } }, userMenuProps)), autoFocus: false, dismissOnEsc: true, dismissOnClickOutside: true, onOpen: () => setIsOpen(true), onClose: () => setIsOpen(false), placement: _popover.PLACEMENT.bottomRight, popperOptions: { modifiers: { flip: { enabled: false } } }, triggerType: _popover.TRIGGER_TYPE.click }, /*#__PURE__*/React.createElement(UserMenuButton, userMenuButtonProps, /*#__PURE__*/React.createElement(_avatar.Avatar, { name: username || '', src: userImgUrl, size: '32px' }), isOpen ? /*#__PURE__*/React.createElement(_chevronUp.default, { size: 28, overrides: { Svg: { style: svgStyleOverride } } }) : /*#__PURE__*/React.createElement(_chevronDown.default, { size: 28, overrides: { Svg: { style: svgStyleOverride } } }))); }