1- import React , { useCallback , useContext , useMemo , useEffect , useState } from 'react'
1+ import React , { useCallback , useContext , useMemo , useEffect , useState , useRef } from 'react'
22import { TriangleDownIcon , ChevronRightIcon } from '@primer/octicons-react'
33import type { AnchoredOverlayProps } from '../AnchoredOverlay'
44import { AnchoredOverlay } from '../AnchoredOverlay'
55import type { OverlayProps } from '../Overlay'
6- import { useProvidedRefOrCreate , useProvidedStateOrCreate , useMenuKeyboardNavigation } from '../hooks'
6+ import { useProvidedStateOrCreate , useMenuKeyboardNavigation , useCombinedRefs } from '../hooks'
77import { Divider } from '../ActionList/Divider'
88import { ActionListContainerContext } from '../ActionList/ActionListContainerContext'
99import type { ButtonProps } from '../Button'
@@ -110,7 +110,9 @@ const Menu: FCWithSlotMarker<React.PropsWithChildren<ActionMenuProps>> = ({
110110 )
111111 const menuButtonChildId = React . isValidElement ( menuButtonChild ) ? menuButtonChild . props . id : undefined
112112
113- const anchorRef = useProvidedRefOrCreate ( externalAnchorRef )
113+ const anchorRef = useRef < HTMLElement > ( null )
114+ const combinedRef = useCombinedRefs ( anchorRef , externalAnchorRef )
115+
114116 const anchorId = useId ( menuButtonChildId )
115117 let renderAnchor : AnchoredOverlayProps [ 'renderAnchor' ] = null
116118 // 🚨 Hack for good API!
@@ -130,7 +132,7 @@ const Menu: FCWithSlotMarker<React.PropsWithChildren<ActionMenuProps>> = ({
130132 anchorChildren ,
131133 mergeAnchorHandlers ( { ...anchorProps } , anchorChildren . props ) ,
132134 )
133- return React . cloneElement ( child , { children : triggerButton , ref : anchorRef } )
135+ return React . cloneElement ( child , { children : triggerButton , ref : combinedRef } )
134136 }
135137 }
136138 return null
@@ -149,7 +151,7 @@ const Menu: FCWithSlotMarker<React.PropsWithChildren<ActionMenuProps>> = ({
149151 mergeAnchorHandlers ( { ...anchorProps } , tooltipTrigger . props ) ,
150152 )
151153 const tooltip = React . cloneElement ( anchorChildren , { children : tooltipTriggerEl } )
152- return React . cloneElement ( child , { children : tooltip , ref : anchorRef } )
154+ return React . cloneElement ( child , { children : tooltip , ref : combinedRef } )
153155 }
154156 }
155157 } else {
@@ -278,7 +280,7 @@ const Overlay: FCWithSlotMarker<React.PropsWithChildren<MenuOverlayProps>> = ({
278280 // we typecast anchorRef as required instead of optional
279281 // because we know that we're setting it in context in Menu
280282 const {
281- anchorRef,
283+ anchorRef : contextAnchorRef ,
282284 renderAnchor,
283285 anchorId,
284286 open,
@@ -287,6 +289,9 @@ const Overlay: FCWithSlotMarker<React.PropsWithChildren<MenuOverlayProps>> = ({
287289 isSubmenu = false ,
288290 } = React . useContext ( MenuContext ) as MandateProps < MenuContextProps , 'anchorRef' >
289291
292+ const anchorRef = useRef < HTMLElement > ( null )
293+ const combinedAnchorRef = useCombinedRefs ( anchorRef , contextAnchorRef )
294+
290295 const containerRef = React . useRef < HTMLDivElement > ( null )
291296 const isNarrow = useResponsiveValue ( { narrow : true } , false )
292297
@@ -328,7 +333,7 @@ const Overlay: FCWithSlotMarker<React.PropsWithChildren<MenuOverlayProps>> = ({
328333
329334 return (
330335 < AnchoredOverlay
331- anchorRef = { anchorRef }
336+ anchorRef = { combinedAnchorRef }
332337 renderAnchor = { renderAnchor }
333338 anchorId = { anchorId }
334339 open = { open }
0 commit comments