GeorgeHop / react-native-screens-swiper

:point_right: Screens swiper lib. fully cross platform(IOS, Android) created for building best UI in your app. swipeable navigation, user profile(like instagram), and many more. :point_left: Just take and try. :v:
https://github.com/GeorgeHop/react-native-screens-swiper
MIT License
20 stars 4 forks source link
horizontal-scrolling horizontalscrollview navigatio react-native react-native-screens-swiper scrollable-pills sticky-headers stickyheader swipeable tabnavigation

react-native-screens-swiper

Simple screens' swiper library with scrollable or static tab navigation. Fully supported on iOS and Android.

Scrollable Pills Static Pills
drawing drawing

:grey_exclamation: Attention :grey_exclamation:

We working on the new version of swiper ! In new version we will make:

  1. Fix all problems of our sticky header container with childrens to make it more looks like in instagram profile. :fire:
  2. Cleanup and simplify huge part of components. :fire:
  3. New animation for nav. :fire:
  4. TypeScript support. :fire:
  5. Big docs. update for better understanding and user experience.

:collision: For now it is all ! But if you have any proposal about performance or improvements of this lib. just write to us. :collision:

New version will be available shortly :watch:

Installation

expo: expo install react-native-screens-swiper
npm: npm i react-native-screens-swiper
yarn: yarn add react-native-screens-swiper

Basic usage

import Swiper from "react-native-screens-swiper";
import FirstScreen from "./FirstScreen";
import SecondScreen from "./SecondScreen";

export default function YourComponent() {
    /**
     * Create an array with your screens' data - title, component and additional props.
     * Title is a string to be put inside of pill.
     * Props is an object with additional data for a particular screen.
     * Component can be either React component, render function or JSX element.
     * If it is a component or function, it will receive above-mentioned props and additional 'index' props
     */
    const data = [
        {
            tabLabel: 'Valid component in form of JSX element',
            component: <FirstScreen/>,
        },
        {
            tabLabel: 'Valid component in form of React component',
            component: SecondScreen,
            props: {}, // (optional) additional props
        },
        {
            tabLabel: 'Valid component in form of render function',
            component: ({index, ...props}) => {
                return null;
            },
            props: {}, // (optional) additional props
        },
    ];

    return (
        <Swiper
            data={data}
            isStaticPills={true}
            style={styles}
            // FlatList props
        />
    );
}

// more about styling below
const styles = {};

Custom styling

export default function App() {
    return (
        <Swiper 
            data={data}
            style={styles}
        />
    );
}

const styles = {
    // [View] Pills container
    pillContainer: {},

    // [View] Static pills container
    staticPillsContainer: {},

    // [View] Button
    pillButton: {},

    // [View] Active button
    pillActive: {},

    // [Text] Button's text
    pillLabel: {},

    // [Text] Active button's text
    activeLabel: {},

    // [View] Border of active pill (:warning: opacity will override animation's opacity)
    borderActive: {},

    // [View] Overflow container for pills container
    pillsOverflow: {
       // Needed if you want to add only bottom shadow
       // Just add the shadow for pillContainer and here add the overflow: 'hidden', and height 
    }
};

Example for scrollable pills

```JS const styles = { pillButton: { backgroundColor: 'white', }, pillActive: { backgroundColor: 'yellow', }, pillLabel: { color: 'gray', }, activeLabel: { color: 'white', }, }; ``` drawing

Example for static pills

```JS const styles = { borderActive: { borderColor: 'pink', }, pillLabel: { color: 'gray', }, activeLabel: { color: '#ba2d65', }, }; ``` drawing

Sticky header and children

You can use sticky header only when scrollableContainer={true} so you need to pass it first. And after adding stickyHeaderEnabled={true} and stickyHeaderIndex={1} you can see the magic !

```JS // other childrens here ``` drawing

Props

Below are the props you can pass to the React Component.

Prop Type Default Example Description
data array [{component: 'your first screen component', tabLabel: 'first screen tabLabel'}, {component: 'your second screen component', tabLabel: 'second screen tabLabel'}] Put array of screens with tab labels for displaying inside the component
isStaticPills boolean false isStaticPills={true} When you need static navigation without scroll
stickyHeaderEnabled boolean false stickyHeaderEnabled={true} Can used only with scrollableContainer={true}. Give header possibility to stick to top of the screen.
scrollableContainer boolean false scrollableContainer={true} Added scrollable container.
children component <Swiper><YourComponent/></Swiper> You can add your own top component in swiper. For example profile info.
style object {pillContainer: {backgroundColor: 'black', height: 50}} The styles object for styling the swiper details. More about styling in Custom styling step.
initialScrollIndex int initialScrollIndex={1} Screen index which will be opened on first open.
stickyHeaderIndex int stickyHeaderIndex={1} An index of child indices determining which children get docked to the top of the screen when scrolling.