useDimensions.tsx 758 B

123456789101112131415161718192021222324252627
  1. import type {RefObject} from 'react';
  2. import {useCallback, useState} from 'react';
  3. import {useResizeObserver} from '@react-aria/utils';
  4. interface Props<Element extends HTMLElement> {
  5. elementRef: RefObject<Element>;
  6. }
  7. /**
  8. * Returns a ref to be added to an element and returns the dimensions of that element
  9. */
  10. export function useDimensions<Element extends HTMLElement>({elementRef}: Props<Element>) {
  11. const [dimensions, setDimensions] = useState({height: 0, width: 0});
  12. const element = elementRef.current;
  13. const onResize = useCallback(() => {
  14. setDimensions({
  15. height: element?.clientHeight || 0,
  16. width: element?.clientWidth || 0,
  17. });
  18. }, [element]);
  19. useResizeObserver({ref: elementRef, onResize});
  20. return dimensions;
  21. }