Use new ResizeObserver hook

This commit is contained in:
schroda
2024-07-12 23:12:11 +02:00
parent f43b7af3cd
commit 40f4350cb8
4 changed files with 79 additions and 69 deletions

View File

@@ -6,17 +6,28 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { RefObject, useLayoutEffect } from 'react';
import { RefObject, useLayoutEffect, useState } from 'react';
export const useResizeObserver = (
ref: RefObject<HTMLElement> | HTMLElement | undefined,
callback: ResizeObserverCallback,
): (() => void) => {
const [disconnect, setDisconnect] = useState<() => void>(() => {});
export const useResizeObserver = (ref: RefObject<HTMLElement>, callback: ResizeObserverCallback) => {
useLayoutEffect(() => {
if (!ref.current) {
const element = ref instanceof HTMLElement ? ref : ref?.current;
if (!element) {
return () => {};
}
const resizeObserver = new ResizeObserver(callback);
resizeObserver.observe(ref.current);
resizeObserver.observe(element);
setDisconnect(() => () => resizeObserver.disconnect());
return () => resizeObserver.disconnect();
}, [ref, callback]);
return disconnect;
};