@@ -184,9 +184,11 @@ function ButtonFn<TTag extends ElementType = typeof DEFAULT_BUTTON_TAG>(
184
184
autoFocus = false ,
185
185
...theirProps
186
186
} = props
187
+ let internalButtonRef = useRef < HTMLButtonElement | null > ( null )
187
188
let getFloatingReferenceProps = useFloatingReferenceProps ( )
188
189
let buttonRef = useSyncRefs (
189
190
ref ,
191
+ internalButtonRef ,
190
192
useFloatingReference ( ) ,
191
193
useEvent ( ( element ) => machine . send ( { type : ActionTypes . SetButtonElement , element } ) )
192
194
)
@@ -222,16 +224,17 @@ function ButtonFn<TTag extends ElementType = typeof DEFAULT_BUTTON_TAG>(
222
224
}
223
225
} )
224
226
225
- let menuState = useSlice ( machine , ( state ) => state . menuState )
226
- let buttonElement = useSlice ( machine , ( state ) => state . buttonElement )
227
- let itemsElement = useSlice ( machine , ( state ) => state . itemsElement )
227
+ let [ menuState , itemsElement ] = useSlice ( machine , ( state ) => [
228
+ state . menuState ,
229
+ state . itemsElement ,
230
+ ] )
228
231
229
232
let handleClick = useEvent ( ( event : ReactMouseEvent ) => {
230
233
if ( isDisabledReactIssue7711 ( event . currentTarget ) ) return event . preventDefault ( )
231
234
if ( disabled ) return
232
235
if ( menuState === MenuState . Open ) {
233
236
flushSync ( ( ) => machine . send ( { type : ActionTypes . CloseMenu } ) )
234
- buttonElement ?. focus ( { preventScroll : true } )
237
+ internalButtonRef . current ?. focus ( { preventScroll : true } )
235
238
} else {
236
239
event . preventDefault ( )
237
240
machine . send ( {
@@ -262,7 +265,7 @@ function ButtonFn<TTag extends ElementType = typeof DEFAULT_BUTTON_TAG>(
262
265
{
263
266
ref : buttonRef ,
264
267
id,
265
- type : useResolveButtonType ( props , buttonElement ) ,
268
+ type : useResolveButtonType ( props , internalButtonRef . current ) ,
266
269
'aria-haspopup' : 'menu' ,
267
270
'aria-controls' : itemsElement ?. id ,
268
271
'aria-expanded' : menuState === MenuState . Open ,
@@ -345,19 +348,19 @@ function ItemsFn<TTag extends ElementType = typeof DEFAULT_ITEMS_TAG>(
345
348
setLocalItemsElement
346
349
)
347
350
348
- let buttonElement = useSlice ( machine , ( state ) => state . buttonElement )
349
- let itemsElement = useSlice ( machine , ( state ) => state . itemsElement )
351
+ let [ menuState , buttonElement ] = useSlice ( machine , ( state ) => [
352
+ state . menuState ,
353
+ state . buttonElement ,
354
+ ] )
350
355
351
356
let portalOwnerDocument = useOwnerDocument ( buttonElement )
352
- let ownerDocument = useOwnerDocument ( itemsElement )
357
+ let ownerDocument = useOwnerDocument ( localItemsElement )
353
358
354
359
// Always enable `portal` functionality, when `anchor` is enabled
355
360
if ( anchor ) {
356
361
portal = true
357
362
}
358
363
359
- let menuState = useSlice ( machine , ( state ) => state . menuState )
360
-
361
364
let usesOpenClosedState = useOpenClosed ( )
362
365
let [ visible , transitionData ] = useTransition (
363
366
transition ,
@@ -380,7 +383,10 @@ function ItemsFn<TTag extends ElementType = typeof DEFAULT_ITEMS_TAG>(
380
383
// Mark other elements as inert when the menu is visible, and `modal` is enabled
381
384
let inertOthersEnabled = __demoMode ? false : modal && menuState === MenuState . Open
382
385
useInertOthers ( inertOthersEnabled , {
383
- allowed : useCallback ( ( ) => [ buttonElement , itemsElement ] , [ buttonElement , itemsElement ] ) ,
386
+ allowed : useCallback (
387
+ ( ) => [ buttonElement , localItemsElement ] ,
388
+ [ buttonElement , localItemsElement ]
389
+ ) ,
384
390
} )
385
391
386
392
// We keep track whether the button moved or not, we only check this when the menu state becomes
@@ -400,16 +406,16 @@ function ItemsFn<TTag extends ElementType = typeof DEFAULT_ITEMS_TAG>(
400
406
let panelEnabled = didButtonMove ? false : visible
401
407
402
408
useEffect ( ( ) => {
403
- let container = itemsElement
409
+ let container = localItemsElement
404
410
if ( ! container ) return
405
411
if ( menuState !== MenuState . Open ) return
406
412
if ( container === ownerDocument ?. activeElement ) return
407
413
408
414
container . focus ( { preventScroll : true } )
409
- } , [ menuState , itemsElement , ownerDocument ] )
415
+ } , [ menuState , localItemsElement , ownerDocument ] )
410
416
411
417
useTreeWalker ( menuState === MenuState . Open , {
412
- container : itemsElement ,
418
+ container : localItemsElement ,
413
419
accept ( node ) {
414
420
if ( node . getAttribute ( 'role' ) === 'menuitem' ) return NodeFilter . FILTER_REJECT
415
421
if ( node . hasAttribute ( 'role' ) ) return NodeFilter . FILTER_SKIP
0 commit comments