npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

Iโ€™ve always been into building performant and accessible sites, but lately Iโ€™ve been taking it extremely seriously. So much so that Iโ€™ve been building a tool to help me optimize and monitor the sites that I build to make sure that Iโ€™m making an attempt to offer the best experience to those who visit them. If youโ€™re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, ๐Ÿ‘‹, Iโ€™m Ryan Hefnerย  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If youโ€™re interested in other things Iโ€™m working on, follow me on Twitter or check out the open source projects Iโ€™ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soonโ€“ish.

Open Software & Tools

This site wouldnโ€™t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you ๐Ÿ™

ยฉ 2025 โ€“ย Pkg Stats / Ryan Hefner

react-native-global-modal-2

v2.0.1

Published

๐ŸŒ Global modal and callable from anywhere on the app for React Native

Readme

React Native Global Modal

npm version npm Platform - Android and iOS License: MIT styled with prettier

Features

โœจ Global Modal Accessible from Anywhere in Your App ๐ŸŽฏ Three Modal Types Out of the Box:

  • Simple Modal
  • Styled Modal with Animations
  • Full Screen Modal ๐ŸŽจ Fully Customizable Styling ๐Ÿ”„ Smooth Animations ๐Ÿ“ฑ iOS and Android Support

Installation

Add the dependency:

npm i react-native-global-modal-2

Peer Dependencies

"react-native-modal": "^13.0.1"

Usage

Import

import GlobalModal, { ModalController } from "react-native-global-modal-2"

Basic Setup

First, import the necessary components:

import GlobalModal, { ModalController } from "react-native-global-modal-2"

Add the GlobalModal component to your app's root:

// App.tsx or your root component
import React, { useRef } from 'react';
import { NavigationContainer } from '@react-navigation/native';
import GlobalModal, { ModalController, GlobalModalRef } from "react-native-global-modal-2";

const App = () => {
  const modalRef = useRef<GlobalModalRef>(null);

  React.useEffect(() => {
    if (modalRef.current) {
      ModalController.setModalRef(modalRef);
    }
  }, []);

  return (
    <NavigationContainer>
      <MainStack />
      <GlobalModal
        ref={modalRef}
        animationIn="fadeIn"
        animationOut="fadeOut"
        onBackdropPress={ModalController.hide}
      />
    </NavigationContainer>
  );
};

Modal Types and Examples

1. Simple Modal

Basic modal with minimal styling:

import { ModalController } from "react-native-global-modal-2";

const showSimpleModal = () => {
  ModalController.show({
    content: (
      <View style={styles.modalContent}>
        <Text style={styles.title}>Simple Modal</Text>
        <Text style={styles.text}>This is a simple modal example</Text>
        <Button title="Close" onPress={() => ModalController.hide()} />
      </View>
    ),
  });
};

const styles = StyleSheet.create({
  modalContent: {
    backgroundColor: '#fff',
    padding: 20,
    borderRadius: 8,
    alignItems: 'center',
  },
  title: {
    fontSize: 18,
    fontWeight: 'bold',
    marginBottom: 10,
  },
  text: {
    marginBottom: 20,
    textAlign: 'center',
  },
});

2. Styled Modal

Modal with custom styling and animations:

const showStyledModal = () => {
  ModalController.show({
    content: (
      <View style={styles.styledContent}>
        <Text style={styles.styledTitle}>Styled Modal</Text>
        <Text style={styles.styledText}>
          Custom styled modal with beautiful design
        </Text>
        <TouchableOpacity
          style={styles.closeButton}
          onPress={() => ModalController.hide()}>
          <Text style={styles.buttonText}>Close</Text>
        </TouchableOpacity>
      </View>
    ),
  });
};

const styles = StyleSheet.create({
  styledContent: {
    backgroundColor: '#4A90E2',
    padding: 30,
    borderRadius: 20,
    alignItems: 'center',
    shadowColor: '#000',
    shadowOffset: { width: 0, height: 2 },
    shadowOpacity: 0.25,
    shadowRadius: 3.84,
    elevation: 5,
  },
  styledTitle: {
    color: '#fff',
    fontSize: 24,
    fontWeight: 'bold',
    marginBottom: 16,
  },
  styledText: {
    color: '#fff',
    marginBottom: 24,
    textAlign: 'center',
  },
  closeButton: {
    backgroundColor: '#fff',
    paddingHorizontal: 20,
    paddingVertical: 10,
    borderRadius: 8,
  },
  buttonText: {
    color: '#4A90E2',
    fontWeight: '600',
  },
});

3. Full Screen Modal

Modal that covers the entire screen:

const showFullScreenModal = () => {
  ModalController.show({
    content: (
      <View style={styles.fullScreenContent}>
        <Text style={styles.fullScreenTitle}>Full Screen Modal</Text>
        <Text style={styles.fullScreenText}>
          This modal takes up the entire screen
        </Text>
        <TouchableOpacity
          style={styles.fullScreenButton}
          onPress={() => ModalController.hide()}>
          <Text style={styles.fullScreenButtonText}>Close</Text>
        </TouchableOpacity>
      </View>
    ),
    isFullScreen: true,
    containerStyle: {
      backgroundColor: '#fff',
    },
  });
};

const styles = StyleSheet.create({
  fullScreenContent: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    padding: 20,
  },
  fullScreenTitle: {
    fontSize: 28,
    fontWeight: 'bold',
    marginBottom: 16,
  },
  fullScreenText: {
    fontSize: 18,
    marginBottom: 24,
    textAlign: 'center',
  },
  fullScreenButton: {
    backgroundColor: '#102B43',
    paddingHorizontal: 24,
    paddingVertical: 12,
    borderRadius: 8,
  },
  fullScreenButtonText: {
    color: '#fff',
    fontSize: 16,
    fontWeight: '600',
  },
});

Advanced Usage

Custom Animations

You can customize the modal animations using any animation type from react-native-modal:

<GlobalModal
  animationIn="slideInUp"  // or fadeIn, bounceIn, etc.
  animationOut="slideOutDown"  // or fadeOut, bounceOut, etc.
  animationInTiming={500}  // animation duration in ms
  animationOutTiming={500}
  backdropTransitionInTiming={500}
  backdropTransitionOutTiming={500}
/>

Modal with Form

Example of a modal containing a form:

const showFormModal = () => {
  const [name, setName] = useState('');
  const [email, setEmail] = useState('');

  const handleSubmit = () => {
    // Handle form submission
    console.log({ name, email });
    ModalController.hide();
  };

  ModalController.show({
    content: (
      <View style={styles.formContent}>
        <Text style={styles.formTitle}>Contact Form</Text>
        <TextInput
          style={styles.input}
          value={name}
          onChangeText={setName}
          placeholder="Enter your name"
        />
        <TextInput
          style={styles.input}
          value={email}
          onChangeText={setEmail}
          placeholder="Enter your email"
          keyboardType="email-address"
        />
        <TouchableOpacity
          style={styles.submitButton}
          onPress={handleSubmit}>
          <Text style={styles.submitText}>Submit</Text>
        </TouchableOpacity>
      </View>
    ),
  });
};

Modal with Loading State

Example of a loading modal:

const showLoadingModal = () => {
  ModalController.show({
    content: (
      <View style={styles.loadingContent}>
        <ActivityIndicator size="large" color="#4A90E2" />
        <Text style={styles.loadingText}>Loading...</Text>
      </View>
    ),
  });

  // Hide the modal after some async operation
  setTimeout(() => {
    ModalController.hide();
  }, 2000);
};

Handling Modal Lifecycle

You can use the onShow and onHide callbacks:

ModalController.show({
  content: <YourModalContent />,
  onShow: () => {
    console.log('Modal shown');
    // Perform actions when modal is shown
  },
  onHide: () => {
    console.log('Modal hidden');
    // Clean up or perform actions when modal is hidden
  },
});

Best Practices

  1. Modal Reference: Always set up the modal reference in your root component to ensure it's accessible throughout your app.

  2. Error Handling: Handle cases where the modal reference might not be set:

const showModal = () => {
  try {
    ModalController.show({
      content: <YourContent />,
    });
  } catch (error) {
    console.warn('Failed to show modal:', error);
  }
};
  1. Styling: Keep modal styles consistent throughout your app by defining a common style theme:
const modalStyles = {
  content: {
    backgroundColor: '#fff',
    borderRadius: 12,
    padding: 20,
  },
  title: {
    fontSize: 20,
    fontWeight: 'bold',
  },
  // ... other common styles
};
  1. Performance: For modals with complex content, consider using useMemo or useCallback:
const ModalContent = React.memo(() => {
  const handlePress = useCallback(() => {
    // Handle press
  }, []);

  return (
    <View>
      <Text>Complex Modal Content</Text>
      <Button onPress={handlePress} title="Action" />
    </View>
  );
});

Configuration

GlobalModal Props

| Property | Type | Description | |--------------|:----------:|-------------------------------------------------| | defaultStyle | ViewStyle | Default style for the modal container | | animationIn | string | Entry animation type (e.g., "fadeIn", "slideInDown") | | animationOut | string | Exit animation type (e.g., "fadeOut", "slideOutUp") | | ...rest | ModalProps | Any prop from react-native-modal |

ModalData Props

| Property | Type | Description | |---------------|:----------:|-------------------------------------------------| | content | ReactNode | Modal content to display | | isFullScreen | boolean | Whether to show as full screen modal | | containerStyle| ViewStyle | Style for the modal container | | onShow | function | Callback when modal is shown | | onHide | function | Callback when modal is hidden |

Styling Examples

Simple Modal

const styles = StyleSheet.create({
  modalContent: {
    backgroundColor: '#fff',
    borderRadius: 16,
    padding: 24,
    alignItems: 'center',
  },
});

Styled Modal

const styles = StyleSheet.create({
  styledContent: {
    backgroundColor: '#4A90E2',
    borderRadius: 20,
    padding: 30,
    alignItems: 'center',
    shadowColor: '#000',
    shadowOffset: { width: 0, height: 2 },
    shadowOpacity: 0.25,
    shadowRadius: 3.84,
    elevation: 5,
  },
});

Full Screen Modal

const styles = StyleSheet.create({
  content: {
    flex: 1,
    width: '100%',
    height: '100%',
    justifyContent: 'center',
    alignItems: 'center',
  },
});

Example Project

To run the example project:

  1. Clone the repository
  2. Navigate to the example directory
  3. Run:
npm install
npx pod-install  # for iOS
npm run ios/android

Future Plans

  • [x] ~~LICENSE~~
  • [x] ~~Custom Layout Feature~~
  • [x] Full Screen Modal Support
  • [ ] More built-in modal types
    • [ ] Alert Modal
    • [ ] Action Sheet Modal
    • [ ] Bottom Sheet Modal
  • [ ] Gesture Controls
  • [ ] Accessibility Improvements
  • [ ] More Examples and Documentation

Credits

Author

FreakyCoder, [email protected]

License

React Native Global Modal is available under the MIT license. See the LICENSE file for more info.