React native drawer, configurable to achieve material design style, slack style, parallax, and more. Works in both iOS and Android.
npm install --save react-native-drawer
import Drawer from 'react-native-drawer'
class Application extends Component {  
  closeControlPanel = () => {
    this._drawer.close()
  };
  openControlPanel = () => {
    this._drawer.open()
  };
  render () {
    return (
      <Drawer
        ref={(ref) => this._drawer = ref}
        content={<ControlPanel />}
        >
        <MainView />
      </Drawer>
    )
  }
})//Parallax Effect (slack style)
<Drawer
  type="static"
  content={<ControlPanel />}
  openDrawerOffset={100}
  styles={drawerStyles}
  tweenHandler={Drawer.tweenPresets.parallax}
  >
    <Main />
</Drawer>
//Material Design Style Drawer
<Drawer
  type="overlay"
  content={<ControlPanel />}
  tapToClose={true}
  openDrawerOffset={0.2} // 20% gap on the right side of drawer
  panCloseMask={0.2}
  closedDrawerOffset={-3}
  styles={drawerStyles}
  tweenHandler={(ratio) => ({
    main: { opacity:(2-ratio)/2 }
  })}
  >
    <Main />
</Drawer>
const drawerStyles = {
  drawer: { shadowColor: '#000000', shadowOpacity: 0.8, shadowRadius: 3},
  main: {paddingLeft: 3},
}This module supports a wide range of drawer styles, and hence has a lot of props.
content(React.Component)null- Menu componenttype(String: displace:overlay:static)displace- Type of drawer.open(Boolean)null- If true will trigger drawer open, if false will trigger close.openDrawerOffset(Number|Function)0- Can either be a integer (pixel value) or decimal (ratio of screen width). Defines the right hand margin when the drawer is open. Or, can be function which returns offset:(viewport) => viewport.width - 200closedDrawerOffset(Number|Function)0- Same as openDrawerOffset, except defines left hand margin when drawer is closed.disabled(Boolean)false- If true the drawer can not be opened and will not respond to pans.styles(Object)null- Styles for the drawer, main, drawerOverlay and mainOverlay container Views.
Note: In the future animations with use Animated, and the api will change.
tweenHandler(Function)null- Takes in the pan ratio (decimal 0 to 1) that represents the tween percent. Returns and object of native props to be set on the constituent views { drawer: {/native props/}, main: {/native props/}, mainOverlay: {/native props/} }tweenDuration(Integer)250- The duration of the open/close animation.tweenEasing(String)linear- A easing type supported by tween-functions
onOpen(Function) - Will be called immediately after the drawer has entered the open state.onOpenStart(Function) callback fired at the start of an open animation.onClose(Function) - Will be called immediately after the drawer has entered the closed state.onCloseStart(Function) callback fired at the start of a close animation.
captureGestures(oneOf(true, false, 'open', 'closed'))open- If true, will capture all gestures inside of the pan mask. If 'open' will only capture when drawer is open.acceptDoubleTap(Boolean)false- Toggle drawer when double tap occurs within pan mask?acceptTap(Boolean)false- Toggle drawer when any tap occurs within pan mask?acceptPan(Boolean)true- Allow for drawer pan (on touch drag). Set to false to effectively disable the drawer while still allowing programmatic control.tapToClose(Boolean)false- Same as acceptTap, except only for close.negotiatePan(Boolean)false- If true, attempts to handle only horizontal swipes, making it play well with a childScrollView.
panThreshold(Number).25- Ratio of screen width that must be travelled to trigger a drawer open/close.panOpenMask(Number)null- Ratio of screen width that is valid for the start of a pan open action. If null -> defaults tomax(.05, closedDrawerOffset).panCloseMask(Number)null- Ratio of screen width that is valid for the start of a pan close action. If null -> defaults tomax(.05, openDrawerOffset).initializeOpen(Boolean)false- Initialize with drawer open?side(String left|right)left- which side the drawer should be on.useInteractionManager(Boolean)false- if true will run InteractionManager for open/close animations.elevation(Number)0- (Android-only) Sets the elevation of the drawer using Android's underlying elevation API
You can achieve pretty much any animation you want using the tween handler with the transformMatrix property. E.G.
tweenHandler={(ratio) => {
  var r0 = -ratio/6
  var r1 = 1-ratio/6
  var t = [
             r1,  r0,  0,  0,
             -r0, r1,  0,  0,
             0,   0,   1,  0,
             0,   0,   0,  1,
          ]
  return {
    main: {
      style: {
        transformMatrix: t,
        opacity: 1 - ratio/2,
      },
    }
  }
}}Will result in a skewed fade out animation.
Three options:
- 
Use the open prop (controlled mode):
<Drawer open={true}
 - 
Using the Drawer Ref:
// assuming ref is set up on the drawer as (ref) => this._drawer = ref onPress={() => {this._drawer.open()}}
 - 
Using Context
contextTypes = {drawer: React.PropTypes.object} // later... this.context.drawer.open()
 
git clone https://github.com/rt2zz/react-native-drawer.gitcd react-native-drawer/examples/RNDrawerDemo && npm install- iOS
- Open ``./examples/RNDrawerDemo/RNDrawerDemo.xcodeproject` in xcode
 command+r(in xcode)
 - Android
- Run android simulator / plug in your android device
 - Run 
react-native run-androidin terminal 
 
Component was adapted from and inspired by @khanghoang's RNSideMenu AND @kureevalexey's react-native-side-menu
