Files
react-native/packages/rn-tester/js/examples/FlatList/FlatList-BaseOnViewableItemsChanged.js
Shawn DempseyandFacebook GitHub Bot 17d0345fdf Migrate FlatList/SectionList E2E testss from Catalyst to RNTester (#46274)
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/46274

changelog: [General][Add] - Add E2E test cases for Flat/SectionList to RNTester

Reviewed By: philIip

Differential Revision: D62002065

fbshipit-source-id: 038907cd7afd33505b7599e390cb9f366b7b32f6
2024-09-06 15:13:33 -07:00

79 lines
2.1 KiB
JavaScript

/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
* @flow
*/
'use strict';
import type {ViewToken} from 'react-native/Libraries/Lists/ViewabilityHelper';
import BaseFlatListExample from './BaseFlatListExample';
import * as React from 'react';
import {FlatList, StyleSheet, View} from 'react-native';
type FlatListProps = React.ElementProps<typeof FlatList>;
type ViewabilityConfig = $PropertyType<FlatListProps, 'viewabilityConfig'>;
const BASE_VIEWABILITY_CONFIG = {
minimumViewTime: 1000,
viewAreaCoveragePercentThreshold: 100,
};
export function FlatList_BaseOnViewableItemsChanged(props: {
offScreen?: ?boolean,
horizontal?: ?boolean,
useScrollRefScroll?: ?boolean,
waitForInteraction?: ?boolean,
}): React.Node {
const {offScreen, horizontal, useScrollRefScroll, waitForInteraction} = props;
const [output, setOutput] = React.useState('');
const onViewableItemsChanged = React.useCallback(
(info: {changed: Array<ViewToken>, viewableItems: Array<ViewToken>, ...}) =>
setOutput(
info.viewableItems
.filter(viewToken => viewToken.index != null && viewToken.isViewable)
.map(viewToken => viewToken.item)
.join(', '),
),
[setOutput],
);
const viewabilityConfig: ViewabilityConfig = {
...BASE_VIEWABILITY_CONFIG,
waitForInteraction: waitForInteraction ?? false,
};
const exampleProps = {
onViewableItemsChanged,
viewabilityConfig,
horizontal,
};
const ref = React.useRef<any>(null);
const onTest =
useScrollRefScroll === true
? () => {
ref?.current?.getScrollResponder()?.scrollToEnd();
}
: null;
return (
<BaseFlatListExample
ref={ref}
exampleProps={exampleProps}
onTest={onTest}
testOutput={output}>
{offScreen === true ? <View style={styles.offScreen} /> : null}
</BaseFlatListExample>
);
}
const styles = StyleSheet.create({
offScreen: {
height: 1000,
},
});