@@ -19,7 +19,7 @@ import type {
1919 RenderErrorMessage ,
2020 SortParams ,
2121} from './types' ;
22- import { useIntersectionObserver } from './useIntersectionObserver ' ;
22+ import { useScrollBasedChunks } from './useScrollBasedChunks ' ;
2323
2424import './PaginatedTable.scss' ;
2525
@@ -32,7 +32,7 @@ export interface PaginatedTableProps<T, F> {
3232 columns : Column < T > [ ] ;
3333 getRowClassName ?: GetRowClassName < T > ;
3434 rowHeight ?: number ;
35- parentContainer ?: Element | null ;
35+ parentRef ?: React . RefObject < HTMLElement > ;
3636 initialSortParams ?: SortParams ;
3737 onColumnsResize ?: HandleTableColumnsResize ;
3838 renderControls ?: RenderControls ;
@@ -50,7 +50,7 @@ export const PaginatedTable = <T, F>({
5050 columns,
5151 getRowClassName,
5252 rowHeight = DEFAULT_TABLE_ROW_HEIGHT ,
53- parentContainer ,
53+ parentRef ,
5454 initialSortParams,
5555 onColumnsResize,
5656 renderControls,
@@ -64,46 +64,36 @@ export const PaginatedTable = <T, F>({
6464 const [ sortParams , setSortParams ] = React . useState < SortParams | undefined > ( initialSortParams ) ;
6565 const [ totalEntities , setTotalEntities ] = React . useState ( initialTotal ) ;
6666 const [ foundEntities , setFoundEntities ] = React . useState ( initialFound ) ;
67- const [ activeChunks , setActiveChunks ] = React . useState < number [ ] > ( [ ] ) ;
6867 const [ isInitialLoad , setIsInitialLoad ] = React . useState ( true ) ;
6968
70- const tableContainer = React . useRef < HTMLDivElement > ( null ) ;
69+ const tableRef = React . useRef < HTMLDivElement > ( null ) ;
70+
71+ const activeChunks = useScrollBasedChunks ( {
72+ containerRef : parentRef ?? tableRef ,
73+ totalItems : foundEntities ,
74+ itemHeight : rowHeight ,
75+ chunkSize : limit ,
76+ } ) ;
7177
7278 const handleDataFetched = React . useCallback ( ( total : number , found : number ) => {
7379 setTotalEntities ( total ) ;
7480 setFoundEntities ( found ) ;
7581 setIsInitialLoad ( false ) ;
7682 } , [ ] ) ;
7783
78- const onEntry = React . useCallback ( ( id : string ) => {
79- setActiveChunks ( ( prev ) => [ ...new Set ( [ ...prev , Number ( id ) ] ) ] ) ;
80- } , [ ] ) ;
81-
82- const onLeave = React . useCallback ( ( id : string ) => {
83- setActiveChunks ( ( prev ) => prev . filter ( ( chunk ) => chunk !== Number ( id ) ) ) ;
84- } , [ ] ) ;
85-
86- const observer = useIntersectionObserver ( { onEntry, onLeave, parentContainer} ) ;
87-
8884 // reset table on filters change
8985 React . useLayoutEffect ( ( ) => {
9086 setTotalEntities ( initialTotal ) ;
9187 setFoundEntities ( initialFound ) ;
9288 setIsInitialLoad ( true ) ;
93- if ( parentContainer ) {
94- parentContainer . scrollTo ( 0 , 0 ) ;
89+ if ( parentRef ?. current ) {
90+ parentRef . current . scrollTo ( 0 , 0 ) ;
9591 } else {
96- tableContainer . current ?. scrollTo ( 0 , 0 ) ;
92+ tableRef . current ?. scrollTo ( 0 , 0 ) ;
9793 }
98-
99- setActiveChunks ( [ 0 ] ) ;
100- } , [ filters , initialFound , initialTotal , limit , parentContainer ] ) ;
94+ } , [ filters , initialFound , initialTotal , limit , parentRef ] ) ;
10195
10296 const renderChunks = ( ) => {
103- if ( ! observer ) {
104- return null ;
105- }
106-
10797 if ( ! isInitialLoad && foundEntities === 0 ) {
10898 return (
10999 < tbody >
@@ -133,7 +123,6 @@ export const PaginatedTable = <T, F>({
133123 renderErrorMessage = { renderErrorMessage }
134124 onDataFetched = { handleDataFetched }
135125 isActive = { activeChunks . includes ( value ) }
136- observer = { observer }
137126 />
138127 ) ) ;
139128 } ;
@@ -161,7 +150,7 @@ export const PaginatedTable = <T, F>({
161150 } ;
162151
163152 return (
164- < div ref = { tableContainer } className = { b ( null , containerClassName ) } >
153+ < div ref = { tableRef } className = { b ( null , containerClassName ) } >
165154 { renderContent ( ) }
166155 </ div >
167156 ) ;
0 commit comments