react-native-modal. See #597If you're new to the React Native world, please notice that React Native itself offers a component that works out-of-the-box.
An enhanced, animated, customizable React Native modal.
The goal of react-native-modal is expanding the original React Native <Modal> component by adding animations, style customization options, and new features, while still providing a simple API.

This library is available on npm, install it with: npm i react-native-modal or yarn add react-native-modal.
Since react-native-modal is an extension of the original React Native modal, it works in a similar fashion.
react-native-modal:import Modal from "react-native-modal";
<Modal> component and nest its content inside of it:function WrapperComponent() {
return (
<View>
<Modal>
<View style={{ flex: 1 }}>
<Text>I am the modal content!</Text>
</View>
</Modal>
</View>
);
}
isVisible prop to true:function WrapperComponent() {
return (
<View>
<Modal isVisible={true}>
<View style={{ flex: 1 }}>
<Text>I am the modal content!</Text>
</View>
</Modal>
</View>
);
}
The isVisible prop is the only prop you'll really need to make the modal work: you should control this prop value by saving it in your wrapper component state and setting it to true or false when needed.
The following example consists in a component (ModalTester) with a button and a modal.
The modal is controlled by the isModalVisible state variable and it is initially hidden, since its value is false.
Pressing the button sets isModalVisible to true, making the modal visible.
Inside the modal there is another button that, when pressed, sets isModalVisible to false, hiding the modal.
import React, { useState } from "react";
import { Button, Text, View } from "react-native";
import Modal from "react-native-modal";
function ModalTester() {
const [isModalVisible, setModalVisible] = useState(false);
const toggleModal = () => {
setModalVisible(!isModalVisible);
};
return (
<View style={{ flex: 1 }}>
<Button title="Show modal" onPress={toggleModal} />
<Modal isVisible={isModalVisible}>
<View style={{ flex: 1 }}>
<Text>Hello!</Text>
<Button title="Hide modal" onPress={toggleModal} />
</View>
</Modal>
</View>
);
}
export default ModalTester;
For a more complex example take a look at the /example directory.
| Name | Type | Default | Description |
|---|---|---|---|
animationIn |
string or object |
"slideInUp" |
Modal show animation |
animationInTiming |
number |
300 |
Timing for the modal show animation (in ms) |
animationOut |
string or object |
"slideOutDown" |
Modal hide animation |
animationOutTiming |
number |
300 |
Timing for the modal hide animation (in ms) |
avoidKeyboard |
bool |
false |
Move the modal up if the keyboard is open |
coverScreen |
bool |
true |
Will use RN Modal component to cover the entire screen wherever the modal is mounted in the component hierarchy |
hasBackdrop |
bool |
true |
Render the backdrop |
backdropColor |
string |
"black" |
The backdrop background color |
backdropOpacity |
number |
0.70 |
The backdrop opacity when the modal is visible |
backdropTransitionInTiming |
number |
300 |
The backdrop show timing (in ms) |
backdropTransitionOutTiming |
number |
300 |
The backdrop hide timing (in ms) |
customBackdrop |
node |
null |
The custom backdrop element |
children |
node |
REQUIRED | The modal content |
deviceHeight |
number |
null |
Device height (useful on devices that can hide the navigation bar) |
deviceWidth |
number |
null |
Device width (useful on devices that can hide the navigation bar) |
isVisible |
bool |
REQUIRED | Show the modal? |
onBackButtonPress |
func |
() => null |
Called when the Android back button is pressed |
onBackdropPress |
func |
() => null |
Called when the backdrop is pressed |
onModalWillHide |
func |
() => null |
Called before the modal hide animation begins |
onModalHide |
func |
() => null |
Called when the modal is completely hidden |
onModalWillShow |
func |
() => null |
Called before the modal show animation begins |
onModalShow |
func |
() => null |
Called when the modal is completely visible |
onSwipeStart |
func |
() => null |
Called when the swipe action started |
onSwipeMove |
func |
(percentageShown) => null |
Called on each swipe event |
onSwipeComplete |
func |
({ swipingDirection }) => null |
Called when the swipeThreshold has been reached |
onSwipeCancel |
func |
() => null |
Called when the swipeThreshold has not been reached |
panResponderThreshold |
number |
4 |
The threshold for when the panResponder should pick up swipe events |
scrollOffset |
number |
0 |
When > 0, disables swipe-to-close, in order to implement scrollable content |
scrollOffsetMax |
number |
0 |
Used to implement overscroll feel when content is scrollable. See /example directory |
scrollTo |
func |
null |
Used to implement scrollable modal. See /example directory for reference on how to use it |
scrollHorizontal |
bool |
false |
Set to true if your scrollView is horizontal (for a correct scroll handling) |
swipeThreshold |
number |
100 |
Swiping threshold that when reached calls onSwipeComplete |
swipeDirection |
string or array |
null |
Defines the direction where the modal can be swiped. Can be 'up', 'down', 'left, or 'right', or a combination of them like ['up','down'] |
useNativeDriver |
bool |
false |
Defines if animations should use native driver |
useNativeDriverForBackdrop |
bool |
null |
Defines if animations for backdrop should use native driver (to avoid flashing on android) |
hideModalContentWhileAnimating |
bool |
false |
Enhances the performance by hiding the modal content until the animations complete |
propagateSwipe |
bool or func |
false |
Allows swipe events to propagate to children components (eg a ScrollView inside a modal) |
style |
any |
null |
Style applied to the modal |
Under the hood react-native-modal uses react-native original Modal component.
Before reporting a bug, try swapping react-native-modal with react-native original Modal component and, if the issue persists, check if it has already been reported as a react-native issue.
React-Native has a few issues detecting the correct device width/height of some devices.
If you're experiencing this issue, you'll need to install [`react-nat
$ claude mcp add react-native-modal \
-- python -m otcore.mcp_server <graph>