use-resize-observer.ts 968 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. import { useCallback, useEffect, useRef } from 'react'
  2. export const useResizeObserver = (handleResize: (element: Element) => void) => {
  3. const resizeRef = useRef<{
  4. element: Element
  5. observer: ResizeObserver
  6. } | null>(null)
  7. const elementRef = useCallback(
  8. (element: Element | null) => {
  9. if (element && 'ResizeObserver' in window) {
  10. if (resizeRef.current) {
  11. resizeRef.current.observer.unobserve(resizeRef.current.element)
  12. }
  13. const observer = new ResizeObserver(([entry]) => {
  14. handleResize(entry.target)
  15. })
  16. resizeRef.current = { element, observer }
  17. observer.observe(element)
  18. handleResize(element) // trigger the callback once
  19. }
  20. },
  21. [handleResize]
  22. )
  23. useEffect(() => {
  24. return () => {
  25. if (resizeRef.current) {
  26. resizeRef.current.observer.unobserve(resizeRef.current.element)
  27. }
  28. }
  29. }, [])
  30. return { elementRef, resizeRef }
  31. }