Skip to content

Repository files navigation

Build Statusnpmnpm

React Native Modals

React Native Modals Library for iOS & Android.

How to thank me ?

Just click on ⭐️ button 😘

Try it with Exponent



BREAKING CHANGE

A lot of backward incompatible changes in v0.22.0. Please, Read the Docs before upgrading to v0.22.0

Installation

npm install --save react-native-modals
# OR
yarn add react-native-modals

Exposed Modules

  • Modal
  • ButtomModal
  • ModalPortal
  • Backdrop
  • ModalButton
  • ModalContent
  • ModalTitle
  • ModalFooter
  • Animation
  • FadeAnimation
  • ScaleAnimation
  • SlideAnimation
  • DragEvent,
  • SwipeDirection,
  • ModalProps
  • ModalFooterProps
  • ModalButtonProps
  • ModalTitleProps
  • ModalContentProps
  • BackdropProps

Examples

Example

Setup - this is essential step

The Component can not be used until ModalPortal is mounted. You should register in your app root. For example:

import{ModalPortal}from'react-native-modals';import{Provider}from'react-redux';constRoot=()=>{return(<Providerstore={store}><App/><ModalPortal/></Provider>);}

Basic Usage

import{Modal,ModalContent}from'react-native-modals';import{Button}from'react-native'<Viewstyle={styles.container}><Buttontitle="Show Modal"onPress={()=>{this.setState({visible: true});}}/><Modalvisible={this.state.visible}onTouchOutside={()=>{this.setState({visible: false});}}><ModalContent>{...}</ModalContent></Modal></View>

Usage - Imperative APIs

show

import{ModalPortal}from'react-native-modals';constid=ModalPortal.show((<View>{...}</View>));

update

ModalPortal.update(id,{children: (<View><Text>Updated</Text></View>),});

dismiss

ModalPortal.dismiss(id);

dismissAll

ModalPortal.dismissAll(id);

Usage - Animation

import{Modal,SlideAnimation,ModalContent}from'react-native-modals';<Viewstyle={styles.container}><Modalvisible={this.state.visible}modalAnimation={newSlideAnimation({slideFrom: 'bottom',})}><ModalContent>{...}</ModalContent></Modal></View>

Usage - Swipe

import{Modal,ModalContent}from'react-native-modals';import{Button}from'react-native'<Viewstyle={styles.container}><Modalvisible={this.state.visible}swipeDirection={['up','down']}// can be string or an arrayswipeThreshold={200}// default 100onSwipeOut={(event)=>{this.setState({visible: false});}}><ModalContent>{...}</ModalContent></Modal></View>

Usage - Modal Title

import{Modal,ModalTitle,ModalContent}from'react-native-modals';<Viewstyle={styles.container}><Modalvisible={this.state.visible}modalTitle={<ModalTitletitle="Modal Title"/>}><ModalContent>{...}</ModalContent></Modal></View>

Usage - Modal Action

import{Modal,ModalFooter,ModalButton,ModalContent}from'react-native-modals';<Viewstyle={styles.container}><Modalvisible={this.state.visible}footer={<ModalFooter><ModalButtontext="CANCEL"onPress={()=>{}}/><ModalButtontext="OK"onPress={()=>{}}/></ModalFooter>}><ModalContent>{...}</ModalContent></Modal></View>

Props

Modal

PropTypeDefaultNote
visiblebooleanfalse
roundedbooleantrue
useNativeDriverbooleantrue
childrenany
modalTitle?React ElementYou can pass a modalTitle component or pass a View for customizing titlebar
width?NumberYour device widthThe Width of modal, you can use fixed width or use percentage. For example 0.5 it means 50%
height?Number300The Height of modal, you can use fixed height or use percentage. For example 0.5 it means 50%
modalAnimation?FadeAnimationanimation for modal
modalStyle?any
containerStyle?anynullFor example: { zIndex: 10, elevation: 10 }
animationDuration?Number200
overlayPointerEvents?StringAvailable option: auto, none
overlayBackgroundColor?String#000
overlayOpacity?Number0.5
hasOverlay?Booleantrue
onShow?FunctionYou can pass shown function as a callback function, will call the function when modal shown
onDismiss?FunctionYou can pass onDismiss function as a callback function, will call the function when modal dismissed
onTouchOutside?Function() => {}
onHardwareBackPress?Function() => trueHandle hardware button presses
onMove?Function() => {}
onSwiping?Function() => {}
onSwipeRelease?Function() => {}
onSwipingOut?Function() => {}
onSwipeOut?Function
swipeDirection?string or Array<string>[]Available option: up, down, left, right
swipeThreshold?number100
footer?React Elementnullfor example: <View><Button text="DISMISS" align="center" onPress={() => {}}/></View>

ModalTitle

PropTypeDefaultNote
titleString
style?anynull
textStyle?anynull
align?StringcenterAvailable option: left, center, right
hasTitleBar?Booltrue

ModalContent

PropTypeDefaultNote
childrenany
style?anynull

ModalFooter

PropTypeDefaultNote
childrenModalButton
bordered?Booleantrue
style?anynull

ModalButton

PropTypeDefaultNote
textString
onPressFunction
align?StringcenterAvailable option: left, center, right
style?anynull
textStyle?anynull
activeOpacity?Number0.6
disabled?Booleanfalse
bordered?Booleanfalse

Backdrop

PropTypeDefaultNote
visibleBoolean
opacityNumber0.5
onPress?Function
backgroundColor?string#000
animationDuration?Number200
pointerEvents?StringnullAvailable option: auto, none
useNativeDriver?Booleantrue

Animation

Params for (*)Animation

FadeAnimation

Preview:

Example:
newFadeAnimation({initialValue: 0,// optionalanimationDuration: 150,// optionaluseNativeDriver: true,// optional})
ParamTypeDefaultNote
initialValueNumber0
animationDuration?Number150
useNativeDriver?Booleantrue

ScaleAnimation

Preview:

Example:
newScaleAnimation({initialValue: 0,// optionaluseNativeDriver: true,// optional})
ParamTypeDefaultNote
initialValueNumber0
useNativeDriverBooleantrue

SlideAnimation

Preview:

Example:
newSlideAnimation({initialValue: 0,// optionalslideFrom: 'bottom',// optionaluseNativeDriver: true,// optional})
ParamTypeDefaultNote
initialValueNumber0
slideFromStringbottomAvailable option: top, bottom, left, right
useNativeDriverBooleantrue

Create your custom animation

Example:
import{Animated}from'react-native';import{Animation}from'react-native-modals';classCustomAnimationextendsAnimation{in(onFinished){Animated.spring(this.animate,{toValue: 1,useNativeDriver: this.useNativeDriver,}).start(onFinished);}out(onFinished){Animated.spring(this.animate,{toValue: 0,useNativeDriver: this.useNativeDriver,}).start(onFinished);}getAnimations(){return{transform: [{translateY: this.animate.interpolate({inputRange: [0,1],outputRange: [800,1],}),}],};}}

Development

yarn

yarn run build

yarn test

About

A react native modals library. Swipeable. Highly customizable. Support multi modals & Support custom animation. For IOS & Android.

Topics

Resources

Stars

2.2k stars

Watchers

26 watching

Forks

Releases

Packages

Used by

Contributors

Languages