11import type { PropsWithChildren } from 'react' ;
2- import React , { useEffect , useRef } from 'react' ;
2+ import React , { useEffect , useRef , useState } from 'react' ;
33import type { PaginatorProps } from '../../types/types' ;
44import { deprecationAndReplacementWarning } from '../../utils/deprecationWarning' ;
55import { DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD } from '../../constants/limits' ;
@@ -59,7 +59,7 @@ export type InfiniteScrollProps = PaginatorProps & {
5959export const InfiniteScroll = ( props : PropsWithChildren < InfiniteScrollProps > ) => {
6060 const {
6161 children,
62- element = 'div' ,
62+ element : Component = 'div' ,
6363 hasMore,
6464 hasMoreNewer,
6565 hasNextPage,
@@ -83,13 +83,13 @@ export const InfiniteScroll = (props: PropsWithChildren<InfiniteScrollProps>) =>
8383 const hasNextPageFlag = hasNextPage || hasMoreNewer ;
8484 const hasPreviousPageFlag = hasPreviousPage || hasMore ;
8585
86- const scrollComponent = useRef < HTMLElement > ( undefined ) ;
86+ const [ scrollComponent , setScrollComponent ] = useState < HTMLElement | null > ( null ) ;
8787 const previousOffset = useRef < number | undefined > ( undefined ) ;
8888 const previousReverseOffset = useRef < number | undefined > ( undefined ) ;
8989
9090 const scrollListenerRef = useRef < ( ) => void > ( undefined ) ;
9191 scrollListenerRef . current = ( ) => {
92- const element = scrollComponent . current ;
92+ const element = scrollComponent ;
9393
9494 if ( ! element || element . offsetParent === null ) {
9595 return ;
@@ -107,6 +107,7 @@ export const InfiniteScroll = (props: PropsWithChildren<InfiniteScrollProps>) =>
107107 }
108108
109109 if ( isLoading ) return ;
110+
110111 if (
111112 previousOffset . current === offset &&
112113 previousReverseOffset . current === reverseOffset
@@ -147,7 +148,8 @@ export const InfiniteScroll = (props: PropsWithChildren<InfiniteScrollProps>) =>
147148 } , [ ] ) ;
148149
149150 useEffect ( ( ) => {
150- const scrollElement = scrollComponent . current ?. parentNode ;
151+ const scrollElement = scrollComponent ?. parentNode ;
152+
151153 if ( ! scrollElement ) return ;
152154
153155 const scrollListener = ( ) => scrollListenerRef . current ?.( ) ;
@@ -160,32 +162,25 @@ export const InfiniteScroll = (props: PropsWithChildren<InfiniteScrollProps>) =>
160162 scrollElement . removeEventListener ( 'scroll' , scrollListener , useCapture ) ;
161163 scrollElement . removeEventListener ( 'resize' , scrollListener , useCapture ) ;
162164 } ;
163- } , [ initialLoad , useCapture ] ) ;
165+ } , [ initialLoad , scrollComponent , useCapture ] ) ;
164166
165167 useEffect ( ( ) => {
166- const scrollElement = scrollComponent . current ?. parentNode ;
167- if ( scrollElement ) {
168- scrollElement . addEventListener ( 'wheel' , mousewheelListener , { passive : false } ) ;
169- }
170- return ( ) => {
171- if ( scrollElement ) {
172- scrollElement . removeEventListener ( 'wheel' , mousewheelListener , useCapture ) ;
173- }
174- } ;
175- } , [ useCapture ] ) ;
168+ const scrollElement = scrollComponent ?. parentNode ;
176169
177- const attributes = {
178- ...elementProps ,
179- ref : ( element : HTMLElement ) => {
180- scrollComponent . current = element ;
181- } ,
182- } ;
183-
184- const childrenArray = [ loader , children ] ;
170+ if ( ! scrollElement ) return ;
185171
186- if ( head ) {
187- childrenArray . unshift ( head ) ;
188- }
172+ scrollElement . addEventListener ( 'wheel' , mousewheelListener , { passive : false } ) ;
189173
190- return React . createElement ( element , attributes , childrenArray ) ;
174+ return ( ) => {
175+ scrollElement . removeEventListener ( 'wheel' , mousewheelListener , useCapture ) ;
176+ } ;
177+ } , [ scrollComponent , useCapture ] ) ;
178+
179+ return (
180+ < Component { ...elementProps } ref = { setScrollComponent } >
181+ { head }
182+ { loader }
183+ { children }
184+ </ Component >
185+ ) ;
191186} ;
0 commit comments