import {RefObject} from '@react-types/shared'; import {useEffect} from 'react'; function hasResizeObserver() { return typeof window.ResizeObserver !== 'undefined'; } type useResizeObserverOptionsType = { ref: RefObject | undefined, box?: ResizeObserverBoxOptions, onResize: () => void } export function useResizeObserver(options: useResizeObserverOptionsType) { const {ref, box, onResize} = options; useEffect(() => { let element = ref?.current; if (!element) { return; } if (!hasResizeObserver()) { window.addEventListener('resize', onResize, false); return () => { window.removeEventListener('resize', onResize, false); }; } else { const resizeObserverInstance = new window.ResizeObserver((entries) => { if (!entries.length) { return; } onResize(); }); resizeObserverInstance.observe(element, {box}); return () => { if (element) { resizeObserverInstance.unobserve(element); } }; } }, [onResize, ref, box]); }