Skip to content

A React Native module that exposes some of the common native dialogs to React Native.

License

Notifications You must be signed in to change notification settings

mohakapt/react-native-native-dialog

Repository files navigation

react-native-native-dialog

A React Native module that exposes some of the common native dialogs to React Native.

Latest Stable Version NPM Downloads GitHub issues Used Languages

✨ Features

  • ✅ Native support for the most commonly used Dialogs on iOS and Android.
  • ✅ Dark mode 🌓 and Accent Color 🌈.
  • ✅ Easy to use Api with support for both Callback and Promise.

🚧 Table of Contents

🚀 Motivation

The issue with trying to mock native components using <View />s is that no matter how much time and effort you spend to make it look like the real-deal, You end up with janky looking results (I spent hours taking screenshots of the real Android dialog and trying to imitate it, And didn't get a satisfying result). But to be fair, using react-native <View />s offers a lot of customization which is something you cannot simply just get with native libraries. So there is a decision that needs to be made.

Anyways I decided to make a library for some of the commonly used dialogs using native APIs.

⬇️ Installation

npm install react-native-native-dialog --save

cd ios && pod install   # Only if you're building for iOS

Or if you're using yarn:

yarn add react-native-native-dialog

cd ios && pod install   # Only if you're building for iOS

⚠️ The library only works with [email protected] and up.

⚒️ Additional Setup

Since this library only works with [email protected] and up there is no need to manually link the library, But there still some additional setup you need to do.

iOS

This library is written in Swift so we need to create a bridging header in your XCode project (If you've already done it you can skip this section).

Create Bridging Header

  1. First of all make sure you run pod install in Terminal inside ios folder.
  2. In XCode, in the project navigator, right click [your project's name]New File...
  3. Select Swift File, click Next and then click Create.
  4. XCode will ask you whether you want to create bridging header, Click Create Bridging Header.
  5. Build your project (Cmd+B), And you're ready to go.

Android

Unfortunately Android doesn't support changing the accentColor dynamically, the only way to use a custom accentColor is to define your style statically in res/values/styles.xml (If you're ok with using the default accentColor #009688 in Android you can skip this section).

  1. Open android/app/src/main/res/values/styles.xml
    • If you don't have one create a new file in the exact same path.
    • Add those tow styles to the bottom of your styles.xml file and replace colorPrimary, colorPrimaryDark and colorAccent with your own colors:
    <resources>
        ...
    
    +    <style name="AlertDialog" parent="Theme.AppCompat.Dialog.Alert">   <!--This theme is used for dark dialog-->
    +        <item name="colorPrimary">#FFB300</item>       <!--Replace the these colors with your own colors-->
    +        <item name="colorPrimaryDark">#FFB300</item>
    +        <item name="colorAccent">#FFB300</item>
    +    </style>
    
    +    <style name="LightAlertDialog" parent="Theme.AppCompat.Light.Dialog.Alert">   <!--This theme is used for light dialog-->
    +        <item name="colorPrimary">#E6A100</item>       <!--Replace the these colors with your own colors-->
    +        <item name="colorPrimaryDark">#E6A100</item>
    +        <item name="colorAccent">#E6A100</item>
    +    </style>
    
    </resources>
  2. Next open up android/app/src/main/java/[...]/MainAppliction.java
    • Add import com.github.mohaka.nativedialog.RNNativeDialogPackage; to the imports at the top of the file
    • Add RNNativeDialogPackage.setDialogTheme(R.style.AlertDialog, R.style.LightAlertDialog); to the bottom of onCreate() method.
    ...
    
    import android.app.Application;
    import android.content.Context;
    
    + import com.github.mohaka.nativedialog.RNNativeDialogPackage;
    
    ...
    
    @Override
    public void onCreate() {
        super.onCreate();
        SoLoader.init(this, /* native exopackage */ false);
    +   RNNativeDialogPackage.setDialogTheme(R.style.AlertDialog, R.style.LightAlertDialog);
        initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
    }
    
    ...
  3. Build your project and start using react-native-native-dialog.

☘️ Example

import NativeDialog from 'react-native-native-dialog';

NativeDialog.showDialog({
   title: 'Do you want to update your iCloud Backup before erasing?',
   message: 'If you erase without updating your backup, you may lose photos and other data that are not yet uploaded to iCloud.',

   positiveButton: 'Back Up Then Erase',
   negativeButton: 'Erase Now',
   neutralButton: 'Cancel',

   negativeButtonStyle: 'default',
   neutralButtonStyle: 'cancel',

   theme: 'dark',
   accentColor: '#ff4a9e',

   onPositivePress: () => console.warn('positive'),
   onNegativePress: () => console.warn('negative'),
   onNeutralPress: () => console.warn('neutral'),

   onDismiss: () => console.warn('dismiss'),
});

🔌 Component API

NativeDialog.showDialog() API

NativeDialog.showInputDialog() API

NativeDialog.showItemsDialog() API

NativeDialog.showNumberPickerDialog() API

NativeDialog.showRatingDialog() API

🤝 Contributing

We would love to have community contributions and support! A few areas where could use help right now:

  • Bug reports and/or fixes
  • Writing tests
  • Creating examples for the docs

If you want to contribute, please submit a pull request, or contact [email protected] for more information. When you commit your messages, follow this convention:

App changes subject
- Optional message
- Another optional message

If you do a breaking change, add an explanation preceded by BREAKING CHANGE: keyword. For example:

BREAKING CHANGE: App changes subject
- Optional message
- Another optional message

💡 FAQ

👍 Support

  • Heysem Katibi - Initial work
  • Yaman Katby

See also the list of contributors who participated in this project.

📝 License

This library is licensed under the MIT License - see the LICENSE.md file for details.

About

A React Native module that exposes some of the common native dialogs to React Native.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •