Files
cinny/src/app/hooks/useResizeObserver.ts
T

28 lines
941 B
TypeScript
Raw Normal View History

2023-06-12 21:15:23 +10:00
import { useEffect, useMemo } from 'react';
export type OnResizeCallback = (entries: ResizeObserverEntry[]) => void;
export const getResizeObserverEntry = (
target: Element,
entries: ResizeObserverEntry[]
): ResizeObserverEntry | undefined => entries.find((entry) => entry.target === target);
export const useResizeObserver = (
2023-06-22 09:14:50 +10:00
onResizeCallback: OnResizeCallback,
observeElement?: Element | null | (() => Element | null)
2023-06-12 21:15:23 +10:00
): ResizeObserver => {
const resizeObserver = useMemo(() => new ResizeObserver(onResizeCallback), [onResizeCallback]);
2023-10-06 13:44:06 +11:00
useEffect(() => () => resizeObserver?.disconnect(), [resizeObserver]);
2023-06-12 21:15:23 +10:00
useEffect(() => {
2023-06-22 09:14:50 +10:00
const element = typeof observeElement === 'function' ? observeElement() : observeElement;
2023-06-12 21:15:23 +10:00
if (element) resizeObserver.observe(element);
return () => {
if (element) resizeObserver.unobserve(element);
};
2023-06-22 09:14:50 +10:00
}, [resizeObserver, observeElement]);
2023-06-12 21:15:23 +10:00
return resizeObserver;
};