react-native-accordion-wrapper
Version:
A handy wrapper of accordion behavior for react native components
29 lines (28 loc) • 1.95 kB
JavaScript
import React from 'react';
import { FlatList } from 'react-native';
import AccordionItem from './AccordionItem';
const Accordion = ({ dataSource, useFlatList = false, rightChevronIcon, itemWrapperStyle, headerItemsStyle, initialActiveIndex, childrenWrapperStyle, listHeaderComponent, headerTitleLabelStyle, shouldSelectOneItemAtATime = true, }) => {
const [activeIndex, setActiveIndex] = React.useState(initialActiveIndex);
React.useEffect(() => {
if (activeIndex !== initialActiveIndex) {
setActiveIndex(initialActiveIndex);
}
}, [initialActiveIndex]);
const renderAccordionItem = ({ item, index, }) => {
let initialForceExpandedState = initialActiveIndex === index;
if (shouldSelectOneItemAtATime) {
initialForceExpandedState = index === activeIndex;
}
return (React.createElement(AccordionItem, { title: item.title, itemWrapperStyle: itemWrapperStyle, isExpandable: !item.nonExpandable, childrenWrapperStyle: childrenWrapperStyle, titleStyle: headerTitleLabelStyle, rightChevronIcon: rightChevronIcon, initialExpandedState: initialForceExpandedState, key: `${item.title}-${index}`, headerStyle: headerItemsStyle, onPress: item.onPress, onExpandStateChange: (isExpanded) => {
if (isExpanded) {
setActiveIndex(index);
}
} }, item.child));
};
return useFlatList ? (React.createElement(FlatList, { data: dataSource, showsHorizontalScrollIndicator: false, ListHeaderComponent: listHeaderComponent, showsVerticalScrollIndicator: false, nestedScrollEnabled: false, horizontal: false, keyExtractor: (item, index) => `${item.title}-${index}`, renderItem: renderAccordionItem })) : (React.createElement(React.Fragment, null,
listHeaderComponent,
dataSource.map((item, index) => {
return renderAccordionItem({ item, index });
})));
};
export default Accordion;