UNPKG

@gravity-ui/uikit

Version:

Gravity UI base styling and components

44 lines (43 loc) 1.68 kB
import * as React from 'react'; export function useLoadMore(scrollContainerRef, options) { const { onLoadMore, loading, scrollOffset = 1 } = options; const isLoadingRef = React.useRef(loading); React.useEffect(() => { const element = scrollContainerRef.current; if (!element || typeof onLoadMore !== 'function') { return undefined; } const onScroll = () => { if (isLoadingRef.current) { return; } const shouldLoadMore = element.scrollHeight - element.scrollTop - element.clientHeight < element.clientHeight * scrollOffset; if (shouldLoadMore) { isLoadingRef.current = true; onLoadMore(); } }; element.addEventListener('scroll', onScroll); return () => { element.removeEventListener('scroll', onScroll); }; }, [scrollContainerRef, onLoadMore, scrollOffset]); const prevLoadingPropRef = React.useRef(loading); React.useLayoutEffect(() => { if (loading !== prevLoadingPropRef.current) { isLoadingRef.current = loading; prevLoadingPropRef.current = loading; } const element = scrollContainerRef.current; if (!element || typeof onLoadMore !== 'function') { return; } const shouldLoadMore = !isLoadingRef.current && element.scrollHeight === element.clientHeight; if (shouldLoadMore) { isLoadingRef.current = true; onLoadMore(); } }, [loading, onLoadMore, scrollContainerRef]); } //# sourceMappingURL=useLoadMore.js.map