@@ -40,26 +40,28 @@ function Menu<T extends object>(props: SpectrumMenuProps<T>, ref: DOMRef<HTMLDiv
40
40
...mergeProps ( contextProps , props )
41
41
} ;
42
42
let domRef = useDOMRef ( ref ) ;
43
- let popoverContainerRef = useRef ( null ) ;
43
+ let [ popoverContainer , setPopoverContainer ] = useState ( null ) ;
44
44
let trayContainerRef = useRef ( null ) ;
45
45
let state = useTreeState ( completeProps ) ;
46
46
let submenuRef = useRef < HTMLDivElement > ( null ) ;
47
47
let { menuProps} = useMenu ( completeProps , state , domRef ) ;
48
48
let { styleProps} = useStyleProps ( completeProps ) ;
49
49
useSyncRef ( contextProps , domRef ) ;
50
50
let [ leftOffset , setLeftOffset ] = useState ( { left : 0 } ) ;
51
+ let prevPopoverContainer = useRef ( null ) ;
51
52
useEffect ( ( ) => {
52
- if ( popoverContainerRef . current ) {
53
- let { left} = popoverContainerRef . current . getBoundingClientRect ( ) ;
53
+ if ( popoverContainer && prevPopoverContainer . current !== popoverContainer && leftOffset . left === 0 ) {
54
+ prevPopoverContainer . current = popoverContainer ;
55
+ let { left} = popoverContainer . getBoundingClientRect ( ) ;
54
56
setLeftOffset ( { left : - 1 * left } ) ;
55
57
}
56
- } , [ ] ) ;
58
+ } , [ leftOffset , popoverContainer ] ) ;
57
59
58
60
let menuLevel = contextProps . submenuLevel ?? - 1 ;
59
61
let hasOpenSubmenu = state . collection . getItem ( rootMenuTriggerState ?. UNSTABLE_expandedKeysStack [ menuLevel + 1 ] ) != null ;
60
62
// TODO: add slide transition
61
63
return (
62
- < MenuStateContext . Provider value = { { popoverContainerRef , trayContainerRef, menu : domRef , submenu : submenuRef , rootMenuTriggerState, state} } >
64
+ < MenuStateContext . Provider value = { { popoverContainer , trayContainerRef, menu : domRef , submenu : submenuRef , rootMenuTriggerState, state} } >
63
65
< div style = { { height : hasOpenSubmenu ? '100%' : undefined } } ref = { trayContainerRef } />
64
66
< FocusScope >
65
67
< TrayHeaderWrapper
@@ -106,7 +108,7 @@ function Menu<T extends object>(props: SpectrumMenuProps<T>, ref: DOMRef<HTMLDiv
106
108
} ) }
107
109
</ div >
108
110
</ TrayHeaderWrapper >
109
- { rootMenuTriggerState ?. isOpen && < div ref = { popoverContainerRef } style = { { width : '100vw' , position : 'absolute' , top : - 5 , ...leftOffset } } /> }
111
+ { rootMenuTriggerState ?. isOpen && < div ref = { setPopoverContainer } style = { { width : '100vw' , position : 'absolute' , top : - 5 , ...leftOffset } } /> }
110
112
</ FocusScope >
111
113
</ MenuStateContext . Provider >
112
114
) ;
0 commit comments