Skip to content

Instantly share code, notes, and snippets.

@maccman
Created March 3, 2021 02:16
Show Gist options
  • Save maccman/600c52bb59c7cbefc164050a6e05f2bf to your computer and use it in GitHub Desktop.
Save maccman/600c52bb59c7cbefc164050a6e05f2bf to your computer and use it in GitHub Desktop.

Revisions

  1. maccman created this gist Mar 3, 2021.
    31 changes: 31 additions & 0 deletions use-dimensions.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,31 @@
    import { RefObject, useMemo, useLayoutEffect, useRef, useState } from 'react'

    type DOMRectRef = [rect: DOMRect, ref: RefObject<HTMLDivElement>]

    export const useDimensions = ():DOMRectRef => {
    const ref = useRef<HTMLDivElement>(null)

    const [rect, setRect] = useState<DOMRect>(DOMRect.fromRect())

    const resizeObserver = useMemo(() => {
    if ( !ref.current ) return

    const observer = new ResizeObserver(entries => {
    for (const entry of entries) {
    setRect(entry.contentRect)
    }
    })

    observer.observe(ref.current)

    return observer
    }, [ref.current])

    useLayoutEffect(() => () => {
    if (ref.current) {
    resizeObserver?.unobserve(ref.current)
    }
    }, [resizeObserver, ref.current])

    return [rect, ref]
    }