UNPKG

@react-ui-org/react-ui

Version:

React UI is a themeable UI library for React apps.

41 lines (32 loc) 1.02 kB
import { useRef, useEffect, } from 'react'; import { getElementsPositionDifference } from '../_helpers/getElementsPositionDifference'; export const useScrollPosition = (effect, contentEl, viewportEl, wait) => { const throttleTimeout = useRef(null); const callBack = (wasDelayed = false) => { effect(getElementsPositionDifference(contentEl, viewportEl)); if (wasDelayed) { throttleTimeout.current = null; } }; useEffect(() => { const viewport = viewportEl.current; const handleScroll = () => { if (wait) { if (throttleTimeout.current === null) { throttleTimeout.current = setTimeout(callBack, wait, true); } } else { callBack(); } }; viewport.addEventListener('scroll', handleScroll); return () => { clearTimeout(throttleTimeout.current); viewport.removeEventListener('scroll', handleScroll); }; }, []); // eslint-disable-line react-hooks/exhaustive-deps }; export default useScrollPosition;