@@ -20,7 +20,11 @@ const VirtualizedList = require('VirtualizedList');
2020const invariant = require ( 'fbjs/lib/invariant' ) ;
2121
2222import type { StyleObj } from 'StyleSheetTypes' ;
23- import type { ViewabilityConfig , ViewToken } from 'ViewabilityHelper' ;
23+ import type {
24+ ViewabilityConfig ,
25+ ViewToken ,
26+ ViewabilityConfigCallbackPair ,
27+ } from 'ViewabilityHelper' ;
2428import type { Props as VirtualizedListProps } from 'VirtualizedList' ;
2529
2630type RequiredProps < ItemT > = {
@@ -191,6 +195,11 @@ type OptionalProps<ItemT> = {
191195 * See `ViewabilityHelper` for flow type and further documentation.
192196 */
193197 viewabilityConfig ?: ViewabilityConfig ,
198+ /**
199+ * List of ViewabilityConfig/onViewableItemsChanged pairs. A specific onViewableItemsChanged
200+ * will be called when its corresponding ViewabilityConfig's conditions are met.
201+ */
202+ viewabilityConfigCallbackPairs ?: Array < ViewabilityConfigCallbackPair > ,
194203} ;
195204type Props < ItemT > = RequiredProps < ItemT > &
196205 OptionalProps < ItemT > &
@@ -405,11 +414,47 @@ class FlatList<ItemT> extends React.PureComponent<Props<ItemT>, void> {
405414 'Changing numColumns on the fly is not supported. Change the key prop on FlatList when ' +
406415 'changing the number of columns to force a fresh render of the component.' ,
407416 ) ;
417+ invariant (
418+ nextProps . onViewableItemsChanged === this . props . onViewableItemsChanged ,
419+ 'Changing onViewableItemsChanged on the fly is not supported' ,
420+ ) ;
421+ invariant (
422+ nextProps . viewabilityConfig === this . props . viewabilityConfig ,
423+ 'Changing viewabilityConfig on the fly is not supported' ,
424+ ) ;
425+ invariant (
426+ nextProps . viewabilityConfigCallbackPairs ===
427+ this . props . viewabilityConfigCallbackPairs ,
428+ 'Changing viewabilityConfigCallbackPairs on the fly is not supported' ,
429+ ) ;
430+
408431 this . _checkProps ( nextProps ) ;
409432 }
410433
434+ constructor(props: Props< * > ) {
435+ super ( props ) ;
436+ if ( this . props . viewabilityConfigCallbackPairs ) {
437+ this . _virtualizedListPairs = this . props . viewabilityConfigCallbackPairs . map (
438+ pair => ( {
439+ viewabilityConfig : pair . viewabilityConfig ,
440+ onViewableItemsChanged : this . _createOnViewableItemsChanged (
441+ pair . onViewableItemsChanged ,
442+ ) ,
443+ } ) ,
444+ ) ;
445+ } else if (this.props.onViewableItemsChanged) {
446+ this . _virtualizedListPairs . push ( {
447+ viewabilityConfig : this . props . viewabilityConfig ,
448+ onViewableItemsChanged : this . _createOnViewableItemsChanged (
449+ this . props . onViewableItemsChanged ,
450+ ) ,
451+ } ) ;
452+ }
453+ }
454+
411455 _hasWarnedLegacy = false ;
412456 _listRef : VirtualizedList ;
457+ _virtualizedListPairs : Array < ViewabilityConfigCallbackPair > = [];
413458
414459 _captureRef = ref => {
415460 /* $FlowFixMe(>=0.53.0 site=react_native_fb,react_native_oss) This comment
@@ -426,6 +471,8 @@ class FlatList<ItemT> extends React.PureComponent<Props<ItemT>, void> {
426471 legacyImplementation,
427472 numColumns,
428473 columnWrapperStyle,
474+ onViewableItemsChanged,
475+ viewabilityConfigCallbackPairs,
429476 } = props ;
430477 invariant (
431478 ! getItem && ! getItemCount ,
@@ -454,6 +501,11 @@ class FlatList<ItemT> extends React.PureComponent<Props<ItemT>, void> {
454501 this . _hasWarnedLegacy = true ;
455502 }
456503 }
504+ invariant (
505+ ! ( onViewableItemsChanged && viewabilityConfigCallbackPairs ) ,
506+ 'FlatList does not support setting both onViewableItemsChanged and ' +
507+ 'viewabilityConfigCallbackPairs.' ,
508+ ) ;
457509 }
458510
459511 _getItem = ( data : Array < ItemT > , index : number ) => {
@@ -500,23 +552,32 @@ class FlatList<ItemT> extends React.PureComponent<Props<ItemT>, void> {
500552 } ) ;
501553 }
502554
503- _onViewableItemsChanged = info => {
504- const { numColumns, onViewableItemsChanged} = this . props ;
505- if ( ! onViewableItemsChanged ) {
506- return ;
507- }
508- if ( numColumns > 1 ) {
509- const changed = [ ] ;
510- const viewableItems = [ ] ;
511- info . viewableItems . forEach ( v =>
512- this . _pushMultiColumnViewable ( viewableItems , v ) ,
513- ) ;
514- info . changed . forEach ( v => this . _pushMultiColumnViewable ( changed , v ) ) ;
515- onViewableItemsChanged ( { viewableItems, changed} ) ;
516- } else {
517- onViewableItemsChanged ( info ) ;
518- }
519- } ;
555+ _createOnViewableItemsChanged (
556+ onViewableItemsChanged : ?( info : {
557+ viewableItems : Array < ViewToken > ,
558+ changed : Array < ViewToken > ,
559+ } ) => void ,
560+ ) {
561+ return ( info : {
562+ viewableItems : Array < ViewToken > ,
563+ changed : Array < ViewToken > ,
564+ } ) => {
565+ const { numColumns } = this . props ;
566+ if ( onViewableItemsChanged ) {
567+ if ( numColumns > 1 ) {
568+ const changed = [ ] ;
569+ const viewableItems = [ ] ;
570+ info . viewableItems . forEach ( v =>
571+ this . _pushMultiColumnViewable ( viewableItems , v ) ,
572+ ) ;
573+ info . changed . forEach ( v => this . _pushMultiColumnViewable ( changed , v ) ) ;
574+ onViewableItemsChanged ( { viewableItems, changed} ) ;
575+ } else {
576+ onViewableItemsChanged ( info ) ;
577+ }
578+ }
579+ } ;
580+ }
520581
521582 _renderItem = ( info : Object ) => {
522583 const { renderItem, numColumns, columnWrapperStyle} = this . props ;
@@ -561,9 +622,7 @@ class FlatList<ItemT> extends React.PureComponent<Props<ItemT>, void> {
561622 getItemCount = { this . _getItemCount }
562623 keyExtractor = { this . _keyExtractor }
563624 ref = { this . _captureRef }
564- onViewableItemsChanged = {
565- this . props . onViewableItemsChanged && this . _onViewableItemsChanged
566- }
625+ viewabilityConfigCallbackPairs = { this . _virtualizedListPairs }
567626 />
568627 ) ;
569628 }
0 commit comments