UNPKG

react-native-swipeout-component

Version:

`React Native Swipeout` is a customizable swipeable row component for React Native, allowing you to create swipe actions like deleting, archiving, or other actions you might want to trigger with a swipe.

358 lines (189 loc) 8.71 kB
### React Native Swipeout Component `React Native Swipeout` is a customizable swipeable row component for React Native, allowing you to create swipe actions like deleting, archiving, or other actions you might want to trigger with a swipe. ![swipeout](https://github.com/user-attachments/assets/0e4f0834-78f5-4fbd-86f8-1595cd7af00a) #### Installation ```bash yarn add react-native-swipeout-component ``` or ```bash npm i react-native-swipeout-component ``` **Note: If you face dependency issues while using npm installation then run this:** ```bash npm i react-native-swipeout-component --legacy-peer-deps ``` #### Usage ```javascript import React from 'react'; import { View, Text, StyleSheet } from 'react-native'; import { Swipeout } from 'react-native-swipeout-component'; const MyComponent = () => {   const rightButtons = [     {       component: <Text style={styles.customButtonText}>Delete</Text>,       buttonBackgroundColor: 'red',       onPress: () => console.log('Delete pressed'),     },   ];   return (     <Swipeout //MAKE SURE TO GIVE IT A HEIGHT style={{height:100}}       right={rightButtons}       autoClose={true}       rightBackgroundColor="lightgray"       buttonWidth={80} // Required when using autoOpenRight or autoOpenLeft       autoOpenRight={true} // Automatically opens the right swipe action     >       <View style={styles.listItem}>         <Text>Swipe me left to delete!</Text>       </View>     </Swipeout>   ); }; const styles = StyleSheet.create({   listItem: {     padding: 20,     backgroundColor: 'white',   },   customButtonText: {     color: 'white',     fontWeight: 'bold',   }, }); export default MyComponent; ``` ### Props | Prop | Type | Default | Description | | --- | --- | --- | --- | | `autoClose` | `boolean` | `false` | Automatically closes the swipe action after a button is pressed. | | `buttonBackgroundColor` | `string` | | Background color for the individual swipe buttons. | | `leftBackgroundColor` | `string` | | Background color when swiping to the left.  **Should be used when you have one button** | | `rightBackgroundColor` | `string` | | Background color when swiping to the right. **Should be used when you have one button** | | `close` | `boolean` | | Programmatically close the swipeout. | | `left` | `array` | `[]` | Array of buttons to show on the left swipe action. Each button can have properties like `text`, `onPress`, `type`, `component`, and `buttonBackgroundColor`. | | `right` | `array` | `[]` | Array of buttons to show on the right swipe action. | | `onOpen` | `function` | | Callback function called when the swipe action is opened. | | `onClose` | `function` | | Callback function called when the swipe action is closed. | | `scroll` | `function` | | Callback function to handle scroll events. | | `style` | `object` | | Custom styles for the swipeout container. | | `sensitivity` | `number` | `50` | Sensitivity of the swipe gesture. | | `buttonWidth` | `number` | | Width of the swipe buttons. **Must be provided if `autoOpenRight` or `autoOpenLeft` is used.** | | `disabled` | `boolean` | `false` | Disable the swipe actions. | | `autoOpenRight` | `boolean` | `false` | Automatically opens the right swipe action when the component is mounted. **Do not use with `autoOpenLeft`.** | | `autoOpenLeft` | `boolean` | `false` | Automatically opens the left swipe action when the component is mounted. **Do not use with `autoOpenRight`.** | | `timeout` | `number` | | Time in milliseconds to keep the swipe action open when `autoOpenRight`or `autoOpenLeft` is used. | | `children` | `ReactNode` | | The content to render inside the swipeout container. | | `dragToCTA` | `boolean` | `false` | Enable drag to call-to-action functionality. | | `onCTA` | `function` | | Callback function to handle the call-to-action event when `dragToCTA` is enabled. |                                                                 | ### Drag to CTA https://github.com/user-attachments/assets/2d8db5a7-6a27-4391-9029-bb5802cabf80 ### Integration with FlatList Here's how you can integrate `react-native-swipeout-component` with a `FlatList` to prevent scrolling while swiping: ```javascript    import React, { useState } from 'react';    import { FlatList, Text, View } from 'react-native';    import Swipeout from 'react-native-swipeout';    const YourComponent = () => {      const [scrollEnabled, setScrollEnabled] = useState(true);      const yourData = [        { key: 'Item 1' },        { key: 'Item 2' },        { key: 'Item 3' },        // Add more items as needed      ];      const renderItem = ({ item }) => {        const swipeoutBtns = [          {            text: 'Delete',            onPress: () => console.log('Delete pressed'),          },          // Add more buttons as needed        ];        return (          <Swipeout            right={swipeoutBtns}            autoClose={true}            backgroundColor="transparent"            onOpen={() => setScrollEnabled(false)}   // Disable scrolling when swipeout is open            onClose={() => setScrollEnabled(true)}   // Re-enable scrolling when swipeout is closed          >            <View style={{ padding: 20, backgroundColor: 'white' }}>              <Text>{item.key}</Text>            </View>          </Swipeout>        );      };      return (        <FlatList          data={yourData}          renderItem={renderItem}          scrollEnabled={scrollEnabled}   // Control scroll based on swipe state          keyExtractor={(item) => item.key}        />      );    };    export default YourComponent; ``` ### Explanation: - **`scrollEnabled` State**: We use a `scrollEnabled` state variable to toggle the scrolling of the `FlatList`. - **`Swipeout` Component**: This component wraps around the list item and provides swipeable buttons. - **`onOpen` and `onClose` Callbacks**: These callbacks are triggered when the swipeout is opened or closed, respectively. They are used to disable the `FlatList`'s scrolling when a swipe action is in progress and re-enable it afterward. ### Notes: - **Performance**: Disabling and enabling scrolling dynamically is usually efficient, but be cautious if you have a very large list or complex items, as it might cause slight jankiness. ### Important Rules 1\. **Auto Open Restrictions**: You should not use `autoOpenRight` and `autoOpenLeft` together. Only one of these properties should be set to `true` to avoid conflicting behaviors. 2\. **Button Width Requirement**: When using `autoOpenRight` or `autoOpenLeft`, you must pass a `buttonWidth` value. This ensures that the component can correctly calculate the swipe action's dimensions and behavior. 3\. **Component not displaying?:** Make sure to give it a height if you can't see the component ### Example with Custom Component Button and Background Colors ```javascript import React from 'react'; import { View, Text, StyleSheet } from 'react-native'; import Swipeout from 'react-native-swipeout-component'; const CustomButtonContent = () => (   <View style={styles.customButtonContent}>     <Text style={styles.customButtonText}>Custom Delete</Text>   </View> ); const MyComponent = () => {   const rightButtons = [     {       component: <CustomButtonContent />, // Passing the custom component       buttonBackgroundColor: 'red',       onPress: () => console.log('Custom Delete pressed'),       width: 80,       height: 60,     },   ];   return (     <Swipeout       right={rightButtons}       autoClose={true}       rightBackgroundColor="lightgray" // Set background color when swiping to the right       buttonWidth={80} // Required when using autoOpenRight or autoOpenLeft       autoOpenRight={true} // Automatically opens the right swipe action     >       <View style={styles.listItem}>         <Text>Swipe me left to see the custom button!</Text>       </View>     </Swipeout>   ); }; const styles = StyleSheet.create({   listItem: {     padding: 20,     backgroundColor: 'white',   },   customButtonContent: {     justifyContent: 'center',     alignItems: 'center',     height: '100%',   },   customButtonText: {     color: 'white',     fontWeight: 'bold',   }, }); export default MyComponent; ```