feat: responsive popovers & menus (#1323)

This commit is contained in:
Aman Harwara
2022-07-21 02:20:14 +05:30
committed by GitHub
parent baf7fb0019
commit 2573407851
44 changed files with 1308 additions and 1415 deletions

View File

@@ -0,0 +1,53 @@
import { useEffect, useState } from 'react'
const DebounceTimeInMs = 100
type Options = {
updateOnWindowResize: boolean
}
/**
* Returns the bounding rect of an element, auto-updated when the element resizes.
* Can optionally be auto-update on window resize.
*/
export const useAutoElementRect = (
element: HTMLElement | null | undefined,
{ updateOnWindowResize }: Options = { updateOnWindowResize: false },
) => {
const [rect, setRect] = useState<DOMRect>()
useEffect(() => {
let windowResizeDebounceTimeout: number
let windowResizeHandler: () => void
if (element) {
const resizeObserver = new ResizeObserver(() => {
setRect(element.getBoundingClientRect())
})
resizeObserver.observe(element)
if (updateOnWindowResize) {
windowResizeHandler = () => {
window.clearTimeout(windowResizeDebounceTimeout)
window.setTimeout(() => {
setRect(element.getBoundingClientRect())
}, DebounceTimeInMs)
}
window.addEventListener('resize', windowResizeHandler)
}
return () => {
resizeObserver.unobserve(element)
if (windowResizeHandler) {
window.removeEventListener('resize', windowResizeHandler)
}
}
} else {
setRect(undefined)
return
}
}, [element, updateOnWindowResize])
return rect
}