@redocly/theme
Version:
Shared UI components lib
50 lines (40 loc) • 1.36 kB
text/typescript
import { useCallback, useEffect, useMemo } from 'react';
import throttle from 'lodash.throttle';
import type { RefObject } from 'react';
export function useFullHeight(element: RefObject<HTMLElement | null>): void {
const handler = useCallback(() => {
if (!element.current) {
return;
}
const footer = document.querySelector('footer');
if (!footer) {
return;
}
const elementTop = element.current.getBoundingClientRect().top;
const footerOffset = footer.offsetTop - window.scrollY - elementTop;
if (footerOffset > window.innerHeight) {
element.current.style.maxHeight = `${window.innerHeight - elementTop}px`;
} else {
element.current.style.maxHeight = `${footerOffset}px`;
}
}, [element]);
const throttledHandler = useMemo(() => throttle(handler, 150), [handler]);
useEffect(() => {
if (typeof window === 'undefined' || !element.current) {
return () => {
// nope
};
}
window.addEventListener('scroll', throttledHandler, {
capture: false,
});
window.addEventListener('resize', throttledHandler, {
capture: false,
});
handler();
return () => {
window.removeEventListener('scroll', throttledHandler);
window.removeEventListener('resize', throttledHandler);
};
}, [throttledHandler, element, handler]);
}