diff --git a/docs/data/base/components/menu/MenuSimple.js b/docs/data/base/components/menu/MenuSimple.js index beda10e5b486b5..f2fce93da94631 100644 --- a/docs/data/base/components/menu/MenuSimple.js +++ b/docs/data/base/components/menu/MenuSimple.js @@ -108,8 +108,15 @@ export default function UnstyledMenuSimple() { const isOpen = Boolean(anchorEl); const buttonRef = React.useRef(null); const menuActions = React.useRef(null); + const preventReopen = React.useRef(false); const handleButtonClick = (event) => { + if (preventReopen.current) { + event.preventDefault(); + preventReopen.current = false; + return; + } + if (isOpen) { setAnchorEl(null); } else { @@ -117,6 +124,14 @@ export default function UnstyledMenuSimple() { } }; + const handleButtonMouseDown = () => { + if (isOpen) { + // Prevents the menu from reopening right after closing + // when clicking the button. + preventReopen.current = true; + } + }; + const handleButtonKeyDown = (event) => { if (event.key === 'ArrowDown' || event.key === 'ArrowUp') { event.preventDefault(); @@ -145,6 +160,7 @@ export default function UnstyledMenuSimple() { type="button" onClick={handleButtonClick} onKeyDown={handleButtonKeyDown} + onMouseDown={handleButtonMouseDown} ref={buttonRef} aria-controls={isOpen ? 'simple-menu' : undefined} aria-expanded={isOpen || undefined} diff --git a/docs/data/base/components/menu/MenuSimple.tsx b/docs/data/base/components/menu/MenuSimple.tsx index d3169aadcfeed9..7a3392246aae41 100644 --- a/docs/data/base/components/menu/MenuSimple.tsx +++ b/docs/data/base/components/menu/MenuSimple.tsx @@ -108,8 +108,15 @@ export default function UnstyledMenuSimple() { const isOpen = Boolean(anchorEl); const buttonRef = React.useRef(null); const menuActions = React.useRef(null); + const preventReopen = React.useRef(false); const handleButtonClick = (event: React.MouseEvent) => { + if (preventReopen.current) { + event.preventDefault(); + preventReopen.current = false; + return; + } + if (isOpen) { setAnchorEl(null); } else { @@ -117,6 +124,14 @@ export default function UnstyledMenuSimple() { } }; + const handleButtonMouseDown = () => { + if (isOpen) { + // Prevents the menu from reopening right after closing + // when clicking the button. + preventReopen.current = true; + } + }; + const handleButtonKeyDown = (event: React.KeyboardEvent) => { if (event.key === 'ArrowDown' || event.key === 'ArrowUp') { event.preventDefault(); @@ -145,6 +160,7 @@ export default function UnstyledMenuSimple() { type="button" onClick={handleButtonClick} onKeyDown={handleButtonKeyDown} + onMouseDown={handleButtonMouseDown} ref={buttonRef} aria-controls={isOpen ? 'simple-menu' : undefined} aria-expanded={isOpen || undefined} diff --git a/docs/data/base/components/menu/WrappedMenuItems.js b/docs/data/base/components/menu/WrappedMenuItems.js index ee6a55c04ba0f4..ab36df248427b9 100644 --- a/docs/data/base/components/menu/WrappedMenuItems.js +++ b/docs/data/base/components/menu/WrappedMenuItems.js @@ -146,8 +146,15 @@ export default function WrappedMenuItems() { const isOpen = Boolean(anchorEl); const buttonRef = React.useRef(null); const menuActions = React.useRef(null); + const preventReopen = React.useRef(false); const handleButtonClick = (event) => { + if (preventReopen.current) { + event.preventDefault(); + preventReopen.current = false; + return; + } + if (isOpen) { setAnchorEl(null); } else { @@ -155,6 +162,14 @@ export default function WrappedMenuItems() { } }; + const handleButtonMouseDown = () => { + if (isOpen) { + // Prevents the menu from reopening right after closing + // when clicking the button. + preventReopen.current = true; + } + }; + const handleButtonKeyDown = (event) => { if (event.key === 'ArrowDown' || event.key === 'ArrowUp') { event.preventDefault(); @@ -183,6 +198,7 @@ export default function WrappedMenuItems() { type="button" onClick={handleButtonClick} onKeyDown={handleButtonKeyDown} + onMouseDown={handleButtonMouseDown} ref={buttonRef} aria-controls={isOpen ? 'wrapped-menu' : undefined} aria-expanded={isOpen || undefined} diff --git a/docs/data/base/components/menu/WrappedMenuItems.tsx b/docs/data/base/components/menu/WrappedMenuItems.tsx index 4949baadeb419c..b39a437a7d274d 100644 --- a/docs/data/base/components/menu/WrappedMenuItems.tsx +++ b/docs/data/base/components/menu/WrappedMenuItems.tsx @@ -145,8 +145,15 @@ export default function WrappedMenuItems() { const isOpen = Boolean(anchorEl); const buttonRef = React.useRef(null); const menuActions = React.useRef(null); + const preventReopen = React.useRef(false); const handleButtonClick = (event: React.MouseEvent) => { + if (preventReopen.current) { + event.preventDefault(); + preventReopen.current = false; + return; + } + if (isOpen) { setAnchorEl(null); } else { @@ -154,6 +161,14 @@ export default function WrappedMenuItems() { } }; + const handleButtonMouseDown = () => { + if (isOpen) { + // Prevents the menu from reopening right after closing + // when clicking the button. + preventReopen.current = true; + } + }; + const handleButtonKeyDown = (event: React.KeyboardEvent) => { if (event.key === 'ArrowDown' || event.key === 'ArrowUp') { event.preventDefault(); @@ -182,6 +197,7 @@ export default function WrappedMenuItems() { type="button" onClick={handleButtonClick} onKeyDown={handleButtonKeyDown} + onMouseDown={handleButtonMouseDown} ref={buttonRef} aria-controls={isOpen ? 'wrapped-menu' : undefined} aria-expanded={isOpen || undefined}