diff --git a/src/index.tsx b/src/index.tsx index 2782fbb..5f20f17 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -30,6 +30,7 @@ interface State { showLoader: boolean; pullToRefreshThresholdBreached: boolean; prevDataLength: number | undefined; + hasScrollbar: boolean; } export default class InfiniteScroll extends Component { @@ -40,17 +41,23 @@ export default class InfiniteScroll extends Component { showLoader: false, pullToRefreshThresholdBreached: false, prevDataLength: props.dataLength, + hasScrollbar: false, }; this.throttledOnScrollListener = throttle(150, this.onScrollListener).bind( this ); + + this.throttledWheelListener = throttle(150, this.onWheelListener).bind( + this + ); this.onStart = this.onStart.bind(this); this.onMove = this.onMove.bind(this); this.onEnd = this.onEnd.bind(this); } private throttledOnScrollListener: (e: MouseEvent) => void; + private throttledWheelListener: (e: WheelEvent) => void; private _scrollableNode: HTMLElement | undefined | null; private el: HTMLElement | undefined | Window & typeof globalThis; private _infScroll: HTMLDivElement | undefined; @@ -83,6 +90,8 @@ export default class InfiniteScroll extends Component { if (this.el) { this.el.addEventListener('scroll', this .throttledOnScrollListener as EventListenerOrEventListenerObject); + this.el.addEventListener('wheel', this + .throttledWheelListener as EventListenerOrEventListenerObject); } if ( @@ -295,6 +304,21 @@ export default class InfiniteScroll extends Component { ); } + onWheelListener = (event: WheelEvent) => { + if (window.pageYOffset > 0) { + this.setState({ + hasScrollbar: true, + }); + } else { + this.setState({ hasScrollbar: false }); + } + + if (!this.state.hasScrollbar && event.deltaY > 0) { + // this means user is trying to scroll vertically down + this.onScrollListener(event); + } + }; + onScrollListener = (event: MouseEvent) => { if (typeof this.props.onScroll === 'function') { // Execute this callback in next tick so that it does not affect the