(element: HTMLElement | null, onResize: () => void)
| 1054 | } |
| 1055 | |
| 1056 | function useResizeObserver(element: HTMLElement | null, onResize: () => void) { |
| 1057 | const handleResize = useCallbackRef(onResize) |
| 1058 | useIsomorphicLayoutEffect(() => { |
| 1059 | let rAF = 0 |
| 1060 | if (element) { |
| 1061 | /** |
| 1062 | * Resize Observer will throw an often benign error that says `ResizeObserver loop |
| 1063 | * completed with undelivered notifications`. This means that ResizeObserver was not |
| 1064 | * able to deliver all observations within a single animation frame, so we use |
| 1065 | * `requestAnimationFrame` to ensure we don't deliver unnecessary observations. |
| 1066 | * Further reading: https://github.com/WICG/resize-observer/issues/38 |
| 1067 | */ |
| 1068 | const resizeObserver = new ResizeObserver(() => { |
| 1069 | cancelAnimationFrame(rAF) |
| 1070 | rAF = window.requestAnimationFrame(handleResize) |
| 1071 | }) |
| 1072 | resizeObserver.observe(element) |
| 1073 | return () => { |
| 1074 | window.cancelAnimationFrame(rAF) |
| 1075 | resizeObserver.unobserve(element) |
| 1076 | } |
| 1077 | } |
| 1078 | }, [element, handleResize]) |
| 1079 | } |
| 1080 | |
| 1081 | /* -----------------------------------------------------------------------------------------------*/ |
| 1082 |
no test coverage detected
searching dependent graphs…