Skip to content

Commit 7b82e5e

Browse files
committed
track changes between renders
1 parent 7f31884 commit 7b82e5e

File tree

1 file changed

+14
-0
lines changed

1 file changed

+14
-0
lines changed

packages/@headlessui-react/src/hooks/use-did-element-move.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { useState } from 'react'
2+
import { flushSync } from 'react-dom'
3+
import { useDisposables } from './use-disposables'
24

35
function getViewportXY(element: HTMLElement) {
46
let rect = element.getBoundingClientRect()
@@ -36,12 +38,24 @@ function getViewportXY(element: HTMLElement) {
3638
export 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

0 commit comments

Comments
 (0)