import { Fragment, forwardRef, useMemo } from 'react'; import { motion } from 'framer-motion'; import PropTypes from 'prop-types'; import { HAIRLINE_DIVIDER_CLASSES, MENU_BUTTON_CLASSES } from './ProfileMenuTheme'; import { app as $appContent } from '../../content'; import { clsm } from '../../utils'; import { createAnimationProps } from '../../helpers/animationPropsHelper'; import { Logout } from '../../assets/icons'; import { useUser } from '../../contexts/User'; import Button from '../Button'; import UserAvatar from '../UserAvatar'; import withPortal from '../withPortal'; const $content = $appContent.navbar; const Popup = forwardRef( ({ navData, toggleProfileMenu, menuClassName }, ref) => { const { userData, logOut } = useUser(); const { avatarSrc, color: profileColor, username } = userData || {}; const hasAvatar = !!avatarSrc; const commonMenuButtonProps = useMemo( () => ({ variant: 'tertiaryText', className: clsm(MENU_BUTTON_CLASSES), onClick: () => toggleProfileMenu(false) }), [toggleProfileMenu] ); return ( img]:hover:rounded-lg', '[&>img]:focus:rounded-lg' ], !hasAvatar && [ '[&>div]:bg-lightMode-gray-light', '[&>div]:hover:bg-lightMode-gray-light-hover', 'dark:[&>div]:bg-darkMode-gray', 'dark:[&>div]:hover:bg-darkMode-gray-hover' ] )} data-testid="profileMenu-avatar" to={`/${username}`} type="nav" > {username || $content.profile} {/* CUSTOM NAVIGATION BUTTONS */} {navData.map(({ icon, label, to, hasDivider, pageName }) => ( {icon} {label} {hasDivider && ( )} ))} {/* LOGOUT BUTTON */} logOut('logOut')}> {$content.log_out} ); } ); const PortalPopup = withPortal(Popup, 'profile-menu-popup', { baseContainerClasses: clsm(['absolute', 'z-[1000]']) }); const MenuPopup = forwardRef(({ asPortal, isOpen, ...restProps }, ref) => asPortal ? ( ) : ( isOpen && ) ); MenuPopup.defaultProps = { asPortal: false, isOpen: false }; MenuPopup.propTypes = { asPortal: PropTypes.bool, isOpen: PropTypes.bool }; Popup.defaultProps = { isOpen: false, menuClassName: '', navData: [] }; Popup.propTypes = { isOpen: PropTypes.bool, navData: PropTypes.array, menuClassName: PropTypes.string, toggleProfileMenu: PropTypes.func.isRequired }; export default MenuPopup;
{username || $content.profile}
{label}
{$content.log_out}