From 7ef25e78f0020e48e147353daa5168343c33db9c Mon Sep 17 00:00:00 2001 From: Simek Date: Tue, 16 Sep 2025 14:11:35 +0200 Subject: [PATCH] SectionList: fix separators position when list is inverted --- .../SectionList/SectionList-withSeparators.js | 27 ++++++++++++++++--- .../SectionList/SectionListBaseExample.js | 9 +++++-- .../Lists/VirtualizedSectionList.js | 12 ++++++--- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/packages/rn-tester/js/examples/SectionList/SectionList-withSeparators.js b/packages/rn-tester/js/examples/SectionList/SectionList-withSeparators.js index d5cc0f260fb..7ed1d871e82 100644 --- a/packages/rn-tester/js/examples/SectionList/SectionList-withSeparators.js +++ b/packages/rn-tester/js/examples/SectionList/SectionList-withSeparators.js @@ -10,7 +10,7 @@ import SectionListBaseExample from './SectionListBaseExample'; import * as React from 'react'; -import {useRef} from 'react'; +import {useRef, useState} from 'react'; import {StyleSheet, Text, View} from 'react-native'; const Separator = @@ -34,22 +34,43 @@ const Separator = }; export function SectionList_withSeparators(): React.Node { + const [isInverted, setInverted] = useState(false); + const exampleProps = { + inverted: isInverted, ItemSeparatorComponent: Separator('lightgreen', 'green', false), SectionSeparatorComponent: Separator('lightblue', 'blue', true), }; const ref = useRef(null); - return ; + function onTest() { + setInverted(!isInverted); + } + + return ( + + ); } const styles = StyleSheet.create({ separator: { - height: 12, + height: 20, + alignItems: 'center', + justifyContent: 'center', }, separatorText: { fontSize: 10, }, + item: { + marginVertical: 0, + }, }); export default { diff --git a/packages/rn-tester/js/examples/SectionList/SectionListBaseExample.js b/packages/rn-tester/js/examples/SectionList/SectionListBaseExample.js index 61f8812f21d..f4a562c0710 100644 --- a/packages/rn-tester/js/examples/SectionList/SectionListBaseExample.js +++ b/packages/rn-tester/js/examples/SectionList/SectionListBaseExample.js @@ -16,6 +16,7 @@ import { StyleSheet, Text, View, + type ViewStyle, } from 'react-native'; const DATA = [ @@ -39,7 +40,7 @@ const DATA = [ /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's * LTI update could not be added via codemod */ -const Item = ({item, section, separators}) => { +const Item = ({item, separators, style}) => { return ( { @@ -54,6 +55,7 @@ const Item = ({item, section, separators}) => { }} style={({pressed}) => [ styles.item, + style, { backgroundColor: pressed ? 'red' : 'pink', }, @@ -71,6 +73,7 @@ type Props = $ReadOnly<{ testLabel?: ?string, testOutput?: ?string, children?: ?React.Node, + itemStyle?: ViewStyle, }>; const SectionListBaseExample: component( @@ -109,7 +112,9 @@ const SectionListBaseExample: component( sections={DATA} keyExtractor={(item, index) => item + index} style={styles.list} - renderItem={Item} + renderItem={({item, separators}) => ( + + )} /* $FlowFixMe[prop-missing] Error revealed after improved builtin React * utility types */ renderSectionHeader={({section: {title}}) => ( diff --git a/packages/virtualized-lists/Lists/VirtualizedSectionList.js b/packages/virtualized-lists/Lists/VirtualizedSectionList.js index ea9cdda2c35..d16c313d7cf 100644 --- a/packages/virtualized-lists/Lists/VirtualizedSectionList.js +++ b/packages/virtualized-lists/Lists/VirtualizedSectionList.js @@ -378,8 +378,12 @@ class VirtualizedSectionList< } } else { const renderItem = info.section.renderItem || this.props.renderItem; + const displayIndex = + !!this.props.inverted && info.section.data.length + ? info.section.data.length - 1 - infoIndex + : infoIndex; const SeparatorComponent = this._getSeparatorComponent( - index, + displayIndex, info, listItemCount, ); @@ -388,7 +392,9 @@ class VirtualizedSectionList<