UNPKG

orcs-design-system

Version:
145 lines 4.8 kB
import _defineProperty from "@babel/runtime/helpers/defineProperty"; function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } import React, { useState, useRef, useEffect } from "react"; import PropTypes from "prop-types"; import Avatar from "../Avatar"; import Icon from "../Icon"; import Divider from "../Divider"; import { Small } from "../Typography"; import { UserMenuToggle, AvatarBorder, UserMenuContainer, UserMenuContent, IconContainer } from "./Header.styles"; import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; const UserMenu = _ref => { let { avatarSource, avatarAlt, avatarInitials, userName, userMenuContent } = _ref; const [isOpen, setIsOpen] = useState(false); const menuRef = useRef(null); useEffect(() => { const handleClickOutside = event => { if (menuRef.current && !menuRef.current.contains(event.target)) { setIsOpen(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, []); const toggleMenu = () => { setIsOpen(!isOpen); }; return /*#__PURE__*/_jsxs(UserMenuContainer, { ref: menuRef, children: [/*#__PURE__*/_jsxs(UserMenuToggle, { onClick: toggleMenu, "data-testid": "user-menu-toggle", children: [/*#__PURE__*/_jsx(AvatarBorder, { className: "avatar-border", borderRadius: "50%", children: /*#__PURE__*/_jsx(Avatar, { customSize: "navBarAvatarSize", image: avatarSource, imageAlt: avatarAlt, initials: avatarInitials }) }), /*#__PURE__*/_jsx(IconContainer, { className: "icon-container", alignItems: "center", justifyContent: "center", borderRadius: "50%", p: "2px", children: /*#__PURE__*/_jsx(Icon, _objectSpread({ icon: ["fas", "chevron-down"], color: "white", size: "xs", mt: isOpen ? "0" : "1px" }, isOpen && { rotation: "180" })) })] }), /*#__PURE__*/_jsxs(UserMenuContent, { p: "s", bg: "white", width: "fit-content", maxWidth: "260px", minWidth: "200px", maxHeight: "430px", border: "solid 1px", borderRadius: "2", gap: "s", flexDirection: "column", alignItems: "flex-start", justifyContent: "flex-start", borderColor: "greyLight", shadow: "default", isOpen: isOpen, children: [/*#__PURE__*/_jsx(Small, { color: "greyDarker", fontSize: "0", children: userName }), /*#__PURE__*/_jsx(Divider, { light: true }), userMenuContent] })] }); }; UserMenu.propTypes = { /** Text for logged in user name and email. */ userName: PropTypes.node, /** Source path for avatar image. */ avatarSource: PropTypes.node, /** Alt text for avatar image. */ avatarAlt: PropTypes.string, /** Initials for avatar as fallback if there is no image */ avatarInitials: PropTypes.string, /** Allows you to pass in child components to user dropdown menu */ userMenuContent: PropTypes.node }; UserMenu.__docgenInfo = { "description": "", "methods": [], "displayName": "UserMenu", "props": { "userName": { "description": "Text for logged in user name and email.", "type": { "name": "node" }, "required": false }, "avatarSource": { "description": "Source path for avatar image.", "type": { "name": "node" }, "required": false }, "avatarAlt": { "description": "Alt text for avatar image.", "type": { "name": "string" }, "required": false }, "avatarInitials": { "description": "Initials for avatar as fallback if there is no image", "type": { "name": "string" }, "required": false }, "userMenuContent": { "description": "Allows you to pass in child components to user dropdown menu", "type": { "name": "node" }, "required": false } } }; export default UserMenu;