import { useState, useEffect, useCallback } from 'react'; const DEFAULT_RECT: DOMRect = { top: 0, left: 0, bottom: 0, right: 0, x: 0, y: 0, width: 0, height: 0, toJSON: () => '{}', }; export function useContainerSize(element: HTMLElement | null): DOMRect { const [size, setSize] = useState(() => element?.getBoundingClientRect() ?? DEFAULT_RECT); const handleResize = useCallback(() => { if (!element) return; const newRect = element.getBoundingClientRect(); setSize(prevRect => { if ( Math.round(prevRect.width) === Math.round(newRect.width) && Math.round(prevRect.height) === Math.round(newRect.height) && Math.round(prevRect.x) === Math.round(newRect.x) && Math.round(prevRect.y) === Math.round(newRect.y) ) { return prevRect; } return newRect; }); }, [element]); useEffect(() => { if (!element) return; const resizeObserver = new ResizeObserver(handleResize); resizeObserver.observe(element); window.addEventListener('click', handleResize); window.addEventListener('resize', handleResize); return () => { resizeObserver.disconnect(); window.removeEventListener('click', handleResize); window.removeEventListener('resize', handleResize); }; }, [element, handleResize]); return size; }