@@ -6,6 +6,7 @@ import type { NativeSyntheticEvent, NativeScrollEvent } from 'react-native';
66import type { FlexGridProps , FlexGridTile } from './types' ;
77import React , { useEffect , useMemo , useRef , useState } from 'react' ;
88import { calcFlexGrid } from './calc-flex-grid' ;
9+ import useThrottle from '../hooks/use-throttle' ;
910
1011export const FlexGrid : React . FC < FlexGridProps > = ( {
1112 data = [ ] ,
@@ -21,18 +22,13 @@ export const FlexGrid: React.FC<FlexGridProps> = ({
2122} ) => {
2223 const [ visibleItems , setVisibleItems ] = useState < FlexGridTile [ ] > ( [ ] ) ;
2324
24- const [ containerWidth , setContainerWidth ] = useState ( 0 ) ;
25- const [ containerHeight , setContainerHeight ] = useState ( 0 ) ;
25+ const [ containerSize , setContainerSize ] = useState ( { width : 0 , height : 0 } ) ;
2626
2727 const scrollPosition = useRef < {
2828 x : number ;
2929 y : number ;
3030 } > ( { x : 0 , y : 0 } ) ;
3131
32- const throttleScrollTimeout = useRef < ReturnType < typeof setTimeout > | null > (
33- null
34- ) ;
35-
3632 const { totalHeight, totalWidth, gridItems } = useMemo ( ( ) => {
3733 return calcFlexGrid ( data , maxColumnRatioUnits , itemSizeUnit ) ;
3834 } , [ data , maxColumnRatioUnits , itemSizeUnit ] ) ;
@@ -42,14 +38,16 @@ export const FlexGrid: React.FC<FlexGridProps> = ({
4238 const updateVisibleItems = ( ) => {
4339 if ( ! virtualization ) return ;
4440
45- const bufferX = containerWidth * virtualizedBufferFactor ;
46- const bufferY = containerHeight * virtualizedBufferFactor ;
41+ const bufferX = containerSize . width * virtualizedBufferFactor ;
42+ const bufferY = containerSize . height * virtualizedBufferFactor ;
4743
4844 const visibleStartX = Math . max ( 0 , scrollPosition . current . x - bufferX ) ;
49- const visibleEndX = scrollPosition . current . x + containerWidth + bufferX ;
45+ const visibleEndX =
46+ scrollPosition . current . x + containerSize . width + bufferX ;
5047
5148 const visibleStartY = Math . max ( 0 , scrollPosition . current . y - bufferY ) ;
52- const visibleEndY = scrollPosition . current . y + containerHeight + bufferY ;
49+ const visibleEndY =
50+ scrollPosition . current . y + containerSize . height + bufferY ;
5351
5452 const vItems = gridItems . filter ( ( item ) => {
5553 const itemRight = item . left + ( item . widthRatio || 1 ) * itemSizeUnit ;
@@ -65,6 +63,11 @@ export const FlexGrid: React.FC<FlexGridProps> = ({
6563 setVisibleItems ( vItems ) ;
6664 } ;
6765
66+ const throttledUpdateVisibleItems = useThrottle (
67+ updateVisibleItems ,
68+ scrollEventInterval
69+ ) ;
70+
6871 const onHorizontalScroll = (
6972 event : NativeSyntheticEvent < NativeScrollEvent >
7073 ) => {
@@ -77,15 +80,7 @@ export const FlexGrid: React.FC<FlexGridProps> = ({
7780 x : nativeEvent . contentOffset . x ,
7881 } ;
7982
80- if ( throttleScrollTimeout . current !== null ) {
81- return ;
82- }
83-
84- throttleScrollTimeout . current = setTimeout ( ( ) => {
85- updateVisibleItems ( ) ;
86-
87- throttleScrollTimeout . current = null ;
88- } , scrollEventInterval ) ;
83+ throttledUpdateVisibleItems ( ) ;
8984 } ;
9085
9186 const onVerticalScroll = ( event : NativeSyntheticEvent < NativeScrollEvent > ) => {
@@ -98,30 +93,15 @@ export const FlexGrid: React.FC<FlexGridProps> = ({
9893 y : nativeEvent . contentOffset . y ,
9994 } ;
10095
101- if ( throttleScrollTimeout . current !== null ) {
102- return ;
103- }
104-
105- throttleScrollTimeout . current = setTimeout ( ( ) => {
106- updateVisibleItems ( ) ;
107-
108- throttleScrollTimeout . current = null ;
109- } , scrollEventInterval ) ;
96+ throttledUpdateVisibleItems ( ) ;
11097 } ;
11198
11299 useEffect ( ( ) => {
113100 //recalculate visible items when itemSizeUnit or maxColumnRatioUnits or data changes
114101 if ( virtualization ) {
115102 updateVisibleItems ( ) ;
116103 }
117- } , [
118- itemSizeUnit ,
119- maxColumnRatioUnits ,
120- data ,
121- virtualization ,
122- containerHeight ,
123- containerWidth ,
124- ] ) ;
104+ } , [ itemSizeUnit , maxColumnRatioUnits , data , virtualization , containerSize ] ) ;
125105
126106 if ( ! renderedList ) {
127107 return null ;
@@ -132,8 +112,7 @@ export const FlexGrid: React.FC<FlexGridProps> = ({
132112 style = { [ { flexGrow : 1 } , style ] }
133113 onLayout = { ( event ) => {
134114 const { width, height } = event . nativeEvent . layout ;
135- setContainerWidth ( width ) ;
136- setContainerHeight ( height ) ;
115+ setContainerSize ( { width, height } ) ;
137116 } }
138117 >
139118 < ScrollView
0 commit comments