2023-06-29 23:17:59 +03:00
|
|
|
import { MutableRefObject, useLayoutEffect, useRef, useState } from 'react';
|
|
|
|
import useResizeObserver from '@react-hook/resize-observer';
|
|
|
|
|
|
|
|
interface Size {
|
2024-08-21 02:54:09 -04:00
|
|
|
width: number;
|
|
|
|
height: number;
|
2023-06-29 23:17:59 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
export default function useElementSize<
|
2024-08-21 02:54:09 -04:00
|
|
|
T extends HTMLElement = HTMLDivElement
|
2023-06-29 23:17:59 +03:00
|
|
|
>(): [MutableRefObject<T | null>, Size] {
|
|
|
|
const target = useRef<T | null>(null);
|
|
|
|
const [size, setSize] = useState<Size>({
|
|
|
|
width: 0,
|
|
|
|
height: 0
|
|
|
|
});
|
|
|
|
|
|
|
|
useLayoutEffect(() => {
|
|
|
|
target.current && setSize(target.current.getBoundingClientRect());
|
|
|
|
}, [target]);
|
|
|
|
|
|
|
|
useResizeObserver(target, (entry) => setSize(entry.contentRect));
|
|
|
|
|
|
|
|
return [target, size];
|
|
|
|
}
|