File tree Expand file tree Collapse file tree 1 file changed +14
-0
lines changed
packages/@headlessui-react/src/hooks Expand file tree Collapse file tree 1 file changed +14
-0
lines changed Original file line number Diff line number Diff line change 11import { useState } from 'react'
2+ import { flushSync } from 'react-dom'
3+ import { useDisposables } from './use-disposables'
24
35function getViewportXY ( element : HTMLElement ) {
46 let rect = element . getBoundingClientRect ( )
@@ -36,12 +38,24 @@ function getViewportXY(element: HTMLElement) {
3638export function useDidElementMove ( enabled : boolean , element : HTMLElement | null ) {
3739 let [ previousXY , setPreviousXY ] = useState < { x : number ; y : number } | null > ( null )
3840 let [ moved , setMoved ] = useState ( false )
41+ let d = useDisposables ( )
3942
4043 // Track the element position before we are interested in knowing if it was moved.
4144 if ( ! enabled && element ) {
4245 let xy = getViewportXY ( element )
4346 if ( previousXY === null || previousXY . x !== xy . x || previousXY . y !== xy . y ) {
4447 setPreviousXY ( xy )
48+
49+ d . requestAnimationFrame ( function retry ( ) {
50+ if ( element ) {
51+ let newXY = getViewportXY ( element )
52+ if ( xy . x !== newXY . x || xy . y !== newXY . y ) {
53+ flushSync ( ( ) => setMoved ( true ) )
54+ } else {
55+ d . requestAnimationFrame ( retry )
56+ }
57+ }
58+ } )
4559 }
4660 }
4761
You can’t perform that action at this time.
0 commit comments