diff --git a/src/components/common/MainMenuDropdown.tsx b/src/components/common/MainMenuDropdown.tsx index cc5088ab5..0d218cc81 100644 --- a/src/components/common/MainMenuDropdown.tsx +++ b/src/components/common/MainMenuDropdown.tsx @@ -68,6 +68,7 @@ const LeftSideMenuDropdown = ({ positionX={shouldHideSearch && lang.isRtl ? 'right' : 'left'} transformOriginX={90} transformOriginY={100} + withPortal onTransitionEnd={lang.isRtl ? handleDropdownMenuTransitionEnd : undefined} > = ({ autoClose = true, }) => { const menuRef = useRef(); + const triggerRef = useRef(); const [isOpen, setIsOpen] = useState(false); + const [menuAnchor, setMenuAnchor] = useState(); const toggleIsOpen = () => { + if (!isOpen && withPortal && triggerRef.current) { + const rect = triggerRef.current.getBoundingClientRect(); + setMenuAnchor({ x: rect.left, y: rect.bottom }); + } + setIsOpen(!isOpen); if (isOpen) { @@ -97,8 +108,16 @@ const DropdownMenu: FC = ({ ); }, [trigger]); + const getTriggerElement = useLastCallback(() => triggerRef.current); + const getRootElement = useLastCallback(() => document.body); + const getMenuElement = useLastCallback( + () => menuRef.current?.querySelector('.bubble') as HTMLElement | undefined, + ); + const getLayout = useLastCallback(() => ({ withPortal: true })); + return (
= ({ onClose={handleClose} onCloseAnimationEnd={onHide} onMouseEnterBackdrop={onMouseEnterBackdrop} + {...(withPortal && menuAnchor ? { + anchor: menuAnchor, + getTriggerElement, + getRootElement, + getMenuElement, + getLayout, + } : undefined)} > {children}