Skip to content

Commit 2db6c92

Browse files
authoredJan 29, 2025··
fix(useResizeObserver): undefined variable alternative (#5595)
* fix(useResizeObserver): undefined variable alternative * Create cyan-shirts-drive.md * fix(useResizeObserver): lint issues
1 parent a1122e4 commit 2db6c92

File tree

2 files changed

+37
-9
lines changed

2 files changed

+37
-9
lines changed
 

‎.changeset/cyan-shirts-drive.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@primer/react": patch
3+
---
4+
5+
fix(useResizeObserver): undefined variable alternative

‎packages/react/src/hooks/useResizeObserver.ts

+32-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type {RefObject} from 'react'
2-
import {useRef} from 'react'
2+
import {useRef, useState} from 'react'
33
import useLayoutEffect from '../utils/useIsomorphicLayoutEffect'
44

55
// https://gist.github.com/strothj/708afcf4f01dd04de8f49c92e88093c3
@@ -14,6 +14,7 @@ export function useResizeObserver<T extends HTMLElement>(
1414
target?: RefObject<T>,
1515
depsArray: unknown[] = [],
1616
) {
17+
const [targetClientRect, setTargetClientRect] = useState<DOMRect | null>(null)
1718
const savedCallback = useRef(callback)
1819

1920
useLayoutEffect(() => {
@@ -26,15 +27,37 @@ export function useResizeObserver<T extends HTMLElement>(
2627
return
2728
}
2829

29-
const observer = new ResizeObserver(entries => {
30-
savedCallback.current(entries)
31-
})
32-
33-
observer.observe(targetEl)
34-
35-
return () => {
36-
observer.disconnect()
30+
if (typeof ResizeObserver === 'function') {
31+
const observer = new ResizeObserver(entries => {
32+
savedCallback.current(entries)
33+
})
34+
35+
observer.observe(targetEl)
36+
37+
return () => {
38+
observer.disconnect()
39+
}
40+
} else {
41+
const saveTargetDimensions = () => {
42+
const currTargetRect = targetEl.getBoundingClientRect()
43+
44+
if (currTargetRect.width !== targetClientRect?.width || currTargetRect.height !== targetClientRect.height) {
45+
savedCallback.current([
46+
{
47+
contentRect: currTargetRect,
48+
},
49+
])
50+
}
51+
setTargetClientRect(currTargetRect)
52+
}
53+
// eslint-disable-next-line github/prefer-observers
54+
window.addEventListener('resize', saveTargetDimensions)
55+
56+
return () => {
57+
window.removeEventListener('resize', saveTargetDimensions)
58+
}
3759
}
60+
3861
// eslint-disable-next-line react-hooks/exhaustive-deps
3962
}, [target, ...depsArray])
4063
}

0 commit comments

Comments
 (0)
Please sign in to comment.