UNPKG

@etsoo/materialui

Version:

TypeScript Material-UI Implementation

86 lines (85 loc) 3.45 kB
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { EventWatcher } from "@etsoo/react"; import React from "react"; import { useNavigate } from "react-router"; import { UserAvatar } from "../UserAvatar"; import IconButton from "@mui/material/IconButton"; import Menu from "@mui/material/Menu"; /** * Event watcher */ export const eventWatcher = new EventWatcher(); const eventWatcherAction = "usermenu.href.transitionend"; /** * User menu * @param props Props * @returns Component */ export function UserMenu(props) { // Destruct const { children, name, avatar } = props; // User menu anchor const [anchorEl, setAnchorEl] = React.useState(); // User menu open or not const isMenuOpen = Boolean(anchorEl); // Route const navigate = useNavigate(); // User menu const handleUserMenuOpen = (event) => { setAnchorEl(event.currentTarget); }; const handleMenuClose = () => { setAnchorEl(undefined); }; const handleClick = async (event) => { handleMenuClose(); const item = event.target?.closest("li[href]"); if (item != null) { const href = item.getAttribute("href"); if (href) { // Even set transitionDuration = 0, still need to wait a little bit eventWatcher.add({ type: eventWatcherAction, action: () => { navigate(href); }, once: true }); } } }; return (_jsxs(React.Fragment, { children: [_jsx(IconButton, { edge: "end", "aria-haspopup": "true", onClick: handleUserMenuOpen, color: "inherit", children: _jsx(UserAvatar, { title: name, src: avatar }) }), _jsx(Menu, { slotProps: { paper: { elevation: 0, sx: { overflow: "visible", filter: "drop-shadow(0px 2px 8px rgba(0,0,0,0.32))", mt: -0.4, "& .MuiAvatar-root": { width: 32, height: 32, ml: -0.5, mr: 1 }, "&:before": { content: '""', display: "block", position: "absolute", top: 0, right: 14, width: 10, height: 10, bgcolor: "background.paper", transform: "translateY(-50%) rotate(45deg)", zIndex: 0 } } } }, disableScrollLock: true, anchorEl: anchorEl, anchorOrigin: { vertical: "bottom", horizontal: "right" }, keepMounted: true, transformOrigin: { vertical: "top", horizontal: "right" }, open: isMenuOpen, transitionDuration: 0, onTransitionEnd: () => eventWatcher.do(eventWatcherAction), onClick: handleClick, onClose: handleMenuClose, children: children(handleMenuClose) })] })); }