import React from 'react'; import { SectionList, SectionListData, StyleSheet, Text, View, ViewToken, } from 'react-native'; import { VerticalListProps } from '../types'; const VerticalList = ({ data, horizontalPressed, horizontalScrollRef, mapping, renderSectionHeader, renderVerticalItem, scrollRef, selected, setSelected, verticalListProps, }: VerticalListProps) => { const onViewableItemsChanged = ({ viewableItems, }: { viewableItems: ViewToken[]; }) => { if (viewableItems[0] && !viewableItems[0].index && !horizontalPressed) { const id = viewableItems[0].section.id; if (id !== selected) { setSelected(id); if (horizontalScrollRef?.current) { horizontalScrollRef.current.scrollToIndex({ animated: true, index: mapping[id], viewPosition: 0.5, }); } } } }; const fallBack = () => { if (horizontalScrollRef?.current) { horizontalScrollRef.current.scrollToIndex({ animated: true, index: 0, viewPosition: 0, }); } if (scrollRef?.current) { scrollRef.current.scrollToLocation({ animated: true, itemIndex: 0, sectionIndex: 0, viewPosition: 0, }); } }; const renderItem = ({ item }: { item: any }) => { if (renderVerticalItem) { return renderVerticalItem(item); } else { return ( {item} ); } }; const renderHeader = ({ section, }: { section: SectionListData; }): React.ReactElement< any, string | React.JSXElementConstructor > | null => { if (renderSectionHeader) { return renderSectionHeader(section); } else { return ( {section.title} ); } }; const keyExtractor = (item: any, index: number) => item?.id?.toString() || index.toString(); const getSectionListProps = () => verticalListProps ? verticalListProps : {}; return ( { fallBack(); }} onViewableItemsChanged={onViewableItemsChanged} ref={scrollRef} renderItem={renderItem} renderSectionHeader={renderHeader} sections={data} showsVerticalScrollIndicator={false} stickySectionHeadersEnabled={false} viewabilityConfig={{ itemVisiblePercentThreshold: 50, }} {...getSectionListProps()} /> ); }; const styles = StyleSheet.create({ contentContainerStyle: { paddingBottom: 80, }, header: { color: 'white', }, headerContainer: { alignItems: 'center', flexDirection: 'row', marginBottom: 8, paddingHorizontal: 24, paddingTop: 24, }, innerHeaderContainer: { backgroundColor: '#252728', borderRadius: 3, height: 23, justifyContent: 'center', paddingHorizontal: 12, width: '100%', }, itemContainer: { backgroundColor: 'rgba(0,0,0,0.1)', marginBottom: 8, paddingHorizontal: 32, paddingVertical: 16, }, }); export default VerticalList;