@alirehman7141/react-native-collapsible
Fully customizable collapsible views
Installation
yarn add @alirehman7141/react-native-collapsible
I am using reanimated 2
for animation. So you should install and follow instruction here to setup your project react-native-reanimated
Key features
1️⃣ Support FlatList/ScrollView
2️⃣ Support sticky header
3️⃣ Can have multiple sticky headers
4️⃣ Easy to customize
Usage
1. Basic
import {
CollapsibleContainer,
CollapsibleFlatList,
CollapsibleScrollView,
} from '@alirehman7141/react-native-collapsible';
const MyComponent = () => {
const {
collapse,
expand,
scrollY,
} = useCollapsibleContext();
return (
<CollapsibleContainer> // 1️⃣ (Required) Outermost container
<CollapsibleHeaderContainer> // 2️⃣ (Required) Header view
<StickyView> // 3️⃣ Sticky view
</StickyView>
</CollapsibleHeaderContainer>
<CollapsibleFlatList // 4️⃣ (Required) Your FlatList/ScrollView
data={data}
renderItem={renderItem}
headerSnappable={false} // <-- should header auto snap when you release the finger
/>
</CollapsibleContainer>
)
}
export default withCollapsibleContext(MyComponent); // 5️⃣ (Required)wrap your component with `withCollapsibleContext`
2. Advance
We support multiple CollapsibleHeaderContainer
and StickyView
. It come useful in case you need to break your code into smaller component.
Parent.tsx
const Parent = () => {
const [tabIndex, setTabIndex] = useState(0)
return (
<CollapsibleContainer>
<CollapsibleHeaderContainer>
<StickyView>
<TabView currentTab={tabIndex} onTabChange={setTabIndex} />
</StickyView>
</CollapsibleHeaderContainer>
{tabIndex === 0 && <FirstTab />}
{tabIndex === 1 && <SecondTab />}
</CollapsibleContainer>
)
}
FirstTab.tsx
const FirstTab = () => {
return (
<>
<CollapsibleHeaderContainer>
<StickyView>
</StickyView>
<View />
<StickyView>
</StickyView>
</CollapsibleHeaderContainer>
<CollapsibleFlatList
data={data}
renderItem={renderItem}
/>
</>
)
}
Showcases
Note: Feel free to add your showcase here by a PR
Breaking changes
1.0.0
-
Removed
persistHeaderHeight
contentMinHeight
-
Added
CollapsibleContainer
StickyView
Tips
- If your header doesn't contains touchable component, try
pointerEvents="none"
<CollapsibleHeaderContainer>
<View pointerEvents="none">
<Text>Header</Text>
</View>
</CollapsibleHeaderContainer>
- If your header contains touchable componet, try to set
pointerEvents="box-none"
for every nested views that contains touchable, otherwise use pointerEvents="none"
<CollapsibleHeaderContainer>
<View pointerEvents="box-none"> // <-- this is parent view
<View pointerEvents="none"> // <-- this view doesn't contain touchable component
<Text>Header</Text>
</View>
<View pointerEvents="box-none"> // <-- this view contain touchable component
<View pointerEvents="none">
<Text>Some text</Text>
</View>
<TouchableOpacity>
<Text>Button</Text>
</TouchableOpacity>
</View>
</View>
</CollapsibleHeaderContainer>
Contributing
See the contributing guide to learn how to contribute to the repository and the development workflow.
License
MIT