@@ -19,7 +19,7 @@ import type {
19
19
RenderErrorMessage ,
20
20
SortParams ,
21
21
} from './types' ;
22
- import { useIntersectionObserver } from './useIntersectionObserver ' ;
22
+ import { useScrollBasedChunks } from './useScrollBasedChunks ' ;
23
23
24
24
import './PaginatedTable.scss' ;
25
25
@@ -32,7 +32,7 @@ export interface PaginatedTableProps<T, F> {
32
32
columns : Column < T > [ ] ;
33
33
getRowClassName ?: GetRowClassName < T > ;
34
34
rowHeight ?: number ;
35
- parentContainer ?: Element | null ;
35
+ parentRef ?: React . RefObject < HTMLElement > ;
36
36
initialSortParams ?: SortParams ;
37
37
onColumnsResize ?: HandleTableColumnsResize ;
38
38
renderControls ?: RenderControls ;
@@ -50,7 +50,7 @@ export const PaginatedTable = <T, F>({
50
50
columns,
51
51
getRowClassName,
52
52
rowHeight = DEFAULT_TABLE_ROW_HEIGHT ,
53
- parentContainer ,
53
+ parentRef ,
54
54
initialSortParams,
55
55
onColumnsResize,
56
56
renderControls,
@@ -64,46 +64,36 @@ export const PaginatedTable = <T, F>({
64
64
const [ sortParams , setSortParams ] = React . useState < SortParams | undefined > ( initialSortParams ) ;
65
65
const [ totalEntities , setTotalEntities ] = React . useState ( initialTotal ) ;
66
66
const [ foundEntities , setFoundEntities ] = React . useState ( initialFound ) ;
67
- const [ activeChunks , setActiveChunks ] = React . useState < number [ ] > ( [ ] ) ;
68
67
const [ isInitialLoad , setIsInitialLoad ] = React . useState ( true ) ;
69
68
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
+ } ) ;
71
77
72
78
const handleDataFetched = React . useCallback ( ( total : number , found : number ) => {
73
79
setTotalEntities ( total ) ;
74
80
setFoundEntities ( found ) ;
75
81
setIsInitialLoad ( false ) ;
76
82
} , [ ] ) ;
77
83
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
-
88
84
// reset table on filters change
89
85
React . useLayoutEffect ( ( ) => {
90
86
setTotalEntities ( initialTotal ) ;
91
87
setFoundEntities ( initialFound ) ;
92
88
setIsInitialLoad ( true ) ;
93
- if ( parentContainer ) {
94
- parentContainer . scrollTo ( 0 , 0 ) ;
89
+ if ( parentRef ?. current ) {
90
+ parentRef . current . scrollTo ( 0 , 0 ) ;
95
91
} else {
96
- tableContainer . current ?. scrollTo ( 0 , 0 ) ;
92
+ tableRef . current ?. scrollTo ( 0 , 0 ) ;
97
93
}
98
-
99
- setActiveChunks ( [ 0 ] ) ;
100
- } , [ filters , initialFound , initialTotal , limit , parentContainer ] ) ;
94
+ } , [ filters , initialFound , initialTotal , limit , parentRef ] ) ;
101
95
102
96
const renderChunks = ( ) => {
103
- if ( ! observer ) {
104
- return null ;
105
- }
106
-
107
97
if ( ! isInitialLoad && foundEntities === 0 ) {
108
98
return (
109
99
< tbody >
@@ -133,7 +123,6 @@ export const PaginatedTable = <T, F>({
133
123
renderErrorMessage = { renderErrorMessage }
134
124
onDataFetched = { handleDataFetched }
135
125
isActive = { activeChunks . includes ( value ) }
136
- observer = { observer }
137
126
/>
138
127
) ) ;
139
128
} ;
@@ -161,7 +150,7 @@ export const PaginatedTable = <T, F>({
161
150
} ;
162
151
163
152
return (
164
- < div ref = { tableContainer } className = { b ( null , containerClassName ) } >
153
+ < div ref = { tableRef } className = { b ( null , containerClassName ) } >
165
154
{ renderContent ( ) }
166
155
</ div >
167
156
) ;
0 commit comments