orcs-design-system
Version:
TeamForm's Design System, aka: ORCS
145 lines • 4.8 kB
JavaScript
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;