diff --git a/src/components/InfiniteScrollPaginator/InfiniteScroll.tsx b/src/components/InfiniteScrollPaginator/InfiniteScroll.tsx index 7b2181080..0f1914d9c 100644 --- a/src/components/InfiniteScrollPaginator/InfiniteScroll.tsx +++ b/src/components/InfiniteScrollPaginator/InfiniteScroll.tsx @@ -1,5 +1,5 @@ import type { PropsWithChildren } from 'react'; -import React, { useEffect, useRef } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import type { PaginatorProps } from '../../types/types'; import { deprecationAndReplacementWarning } from '../../utils/deprecationWarning'; import { DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD } from '../../constants/limits'; @@ -59,7 +59,7 @@ export type InfiniteScrollProps = PaginatorProps & { export const InfiniteScroll = (props: PropsWithChildren) => { const { children, - element = 'div', + element: Component = 'div', hasMore, hasMoreNewer, hasNextPage, @@ -83,13 +83,13 @@ export const InfiniteScroll = (props: PropsWithChildren) => const hasNextPageFlag = hasNextPage || hasMoreNewer; const hasPreviousPageFlag = hasPreviousPage || hasMore; - const scrollComponent = useRef(undefined); + const [scrollComponent, setScrollComponent] = useState(null); const previousOffset = useRef(undefined); const previousReverseOffset = useRef(undefined); const scrollListenerRef = useRef<() => void>(undefined); scrollListenerRef.current = () => { - const element = scrollComponent.current; + const element = scrollComponent; if (!element || element.offsetParent === null) { return; @@ -107,6 +107,7 @@ export const InfiniteScroll = (props: PropsWithChildren) => } if (isLoading) return; + if ( previousOffset.current === offset && previousReverseOffset.current === reverseOffset @@ -147,7 +148,8 @@ export const InfiniteScroll = (props: PropsWithChildren) => }, []); useEffect(() => { - const scrollElement = scrollComponent.current?.parentNode; + const scrollElement = scrollComponent?.parentNode; + if (!scrollElement) return; const scrollListener = () => scrollListenerRef.current?.(); @@ -160,32 +162,25 @@ export const InfiniteScroll = (props: PropsWithChildren) => scrollElement.removeEventListener('scroll', scrollListener, useCapture); scrollElement.removeEventListener('resize', scrollListener, useCapture); }; - }, [initialLoad, useCapture]); + }, [initialLoad, scrollComponent, useCapture]); useEffect(() => { - const scrollElement = scrollComponent.current?.parentNode; - if (scrollElement) { - scrollElement.addEventListener('wheel', mousewheelListener, { passive: false }); - } - return () => { - if (scrollElement) { - scrollElement.removeEventListener('wheel', mousewheelListener, useCapture); - } - }; - }, [useCapture]); + const scrollElement = scrollComponent?.parentNode; - const attributes = { - ...elementProps, - ref: (element: HTMLElement) => { - scrollComponent.current = element; - }, - }; - - const childrenArray = [loader, children]; + if (!scrollElement) return; - if (head) { - childrenArray.unshift(head); - } + scrollElement.addEventListener('wheel', mousewheelListener, { passive: false }); - return React.createElement(element, attributes, childrenArray); + return () => { + scrollElement.removeEventListener('wheel', mousewheelListener, useCapture); + }; + }, [scrollComponent, useCapture]); + + return ( + + {head} + {loader} + {children} + + ); };