DEV Community

Cover image for Announcing React Native Versatile Modal: One Modal Component to Rule Them All
NonsoBarn
NonsoBarn

Posted on

Announcing React Native Versatile Modal: One Modal Component to Rule Them All

Announcing React Native Versatile Modal: One Modal Component to Rule Them All

React Native Modal

I'm thrilled to announce the release of my first npm package: @nonsobarn/react-native-versatile-modal! ๐Ÿš€

The Problem That Needed Solving

As React Native developers, we've all been there. You need a simple alert modal in one part of your app, a bottom sheet in another, a side drawer for navigation, and a full-screen modal for immersive experiences. Traditionally, this meant:

  • Installing multiple modal libraries with different APIs
  • Dealing with inconsistent animations and behaviors
  • Wrestling with conflicting dependencies
  • Maintaining different code patterns throughout your app

I found myself constantly switching between different modal solutions or building custom ones from scratch. That's when I decided to build a unified solution that handles all modal use cases with a consistent, developer-friendly API.

What is React Native Versatile Modal?

React Native Versatile Modal is a comprehensive modal component that provides four essential modal types in one lightweight package:

๐ŸŽฏ 4 Modal Types, One Component

// Bottom Sheet - Perfect for mobile-first UIs
<ModalWrapper
  visible={visible}
  onClose={() => setVisible(false)}
  type="bottom-sheet"
  bottomSheetHeight="60%"
  enableSwipeDown={true}
>
  <YourContent />
</ModalWrapper>

// Drawer - Ideal for navigation menus
<ModalWrapper
  visible={visible}
  onClose={() => setVisible(false)}
  type="drawer"
  drawerPosition="left"
  drawerWidth="80%"
>
  <NavigationMenu />
</ModalWrapper>

// Center Modal - Classic dialogs and alerts
<ModalWrapper
  visible={visible}
  onClose={() => setVisible(false)}
  type="center"
  centerModalWidth="90%"
>
  <AlertContent />
</ModalWrapper>

// Full Screen - Immersive experiences
<ModalWrapper
  visible={visible}
  onClose={() => setVisible(false)}
  type="full-screen"
>
  <FullScreenContent />
</ModalWrapper>
Enter fullscreen mode Exit fullscreen mode

โœจ Key Features

  • ๐Ÿš€ Smooth Animations: 60fps performance using React Native's native driver
  • ๐Ÿ‘† Gesture Support: Swipe-to-dismiss for bottom sheets and intuitive interactions
  • ๐ŸŽฏ TypeScript Ready: Full type definitions included for better development experience
  • ๐ŸŽจ Fully Customizable: Theme colors, animations, dimensions - make it your own
  • ๐Ÿชถ Zero Dependencies: Lightweight with no extra baggage (except React Native peer deps)
  • โ™ฟ Accessible: Built with accessibility in mind from day one
  • ๐Ÿ“ฑ Responsive: Easy integration with your responsive design system

Why This Package Stands Out

1. Consistent API Across All Modal Types

No more learning different APIs for different modal types. The same intuitive props work across all variations.

2. Performance-First Design

Leveraging React Native's native driver for animations ensures buttery-smooth 60fps performance, even on lower-end devices.

3. Developer Experience

// Simple usage for common cases
<ModalWrapper visible={visible} onClose={handleClose} type="bottom-sheet">
  <YourContent />
</ModalWrapper>

// Advanced customization when needed
<ModalWrapper
  visible={visible}
  onClose={handleClose}
  type="bottom-sheet"
  animationDuration={400}
  backdropOpacity={0.7}
  theme={{
    backgroundColor: '#1a1a1a',
    backdropColor: '#000000',
  }}
  enableSwipeDown={true}
  swipeThreshold={100}
>
  <YourContent />
</ModalWrapper>
Enter fullscreen mode Exit fullscreen mode

4. TypeScript Excellence

Full type safety with comprehensive TypeScript definitions:

import ModalWrapper, {
  ModalType,
  ModalWrapperProps,
  ThemeConfig,
} from '@nonsobarn/react-native-versatile-modal';
Enter fullscreen mode Exit fullscreen mode

Installation

npm install @nonsobarn/react-native-versatile-modal
# or
yarn add @nonsobarn/react-native-versatile-modal
Enter fullscreen mode Exit fullscreen mode

Real-World Usage Examples

Custom Styled Bottom Sheet

<ModalWrapper
  visible={settingsVisible}
  onClose={() => setSettingsVisible(false)}
  type="bottom-sheet"
  bottomSheetHeight="70%"
  theme={{
    backgroundColor: '#1a1a1a',
    backdropColor: '#000000',
    handleColor: '#666666',
  }}
  containerStyle={{
    borderTopLeftRadius: 30,
    borderTopRightRadius: 30,
  }}
>
  <View style={styles.settingsContent}>
    <Text style={styles.settingsTitle}>Settings</Text>
    {/* Your settings options */}
  </View>
</ModalWrapper>
Enter fullscreen mode Exit fullscreen mode

Non-Dismissible Confirmation Modal

<ModalWrapper
  visible={confirmVisible}
  onClose={() => setConfirmVisible(false)}
  type="center"
  enableBackdropDismiss={false}
  enableSwipeDown={false}
>
  <View style={styles.alertBox}>
    <Text>This action cannot be undone. Are you sure?</Text>
    <Button title="Confirm" onPress={handleConfirm} />
  </View>
</ModalWrapper>
Enter fullscreen mode Exit fullscreen mode

What I Learned Building This Package

๐Ÿ“ฆ Package Publishing & Semantic Versioning

Going through the entire npm package lifecycle taught me the importance of proper semantic versioning. Every version bump tells a story about your changes:

  • Patch (0.0.1): Bug fixes
  • Minor (0.1.0): New features, backward compatible
  • Major (1.0.0): Breaking changes

๐Ÿ“š Writing Developer-Focused Documentation

Good documentation is everything for open source. I learned to:

  • Write clear, copy-pasteable examples
  • Anticipate common questions and answer them proactively
  • Structure documentation for both quick-start and deep-dive usage
  • Include TypeScript examples alongside regular JavaScript

๐Ÿ›  Maintaining Open Source Projects

Open source is more than just code. It's about:

  • Creating clear contribution guidelines
  • Being responsive to issues and PRs
  • Building a community around your project
  • Balancing new features with stability

๐ŸŽฏ API Design Principles

Designing a good API means:

  • Making simple things simple and complex things possible
  • Providing sensible defaults while allowing customization
  • Maintaining consistency across similar functionalities
  • Thinking about edge cases and error handling

Performance Considerations

The component is built with performance in mind:

// Use useCallback for handlers to prevent unnecessary re-renders
const handleClose = useCallback(() => {
  setVisible(false);
}, []);

// Memoize heavy content
const modalContent = useMemo(() => <HeavyComponent />, []);

// Avoid inline styles
<ModalWrapper
  visible={visible}
  onClose={handleClose}
  containerStyle={styles.customContainer}
>
  {modalContent}
</ModalWrapper>
Enter fullscreen mode Exit fullscreen mode

Get Involved!

I'd love for you to try out React Native Versatile Modal and share your feedback:

  • ๐Ÿ› Found a bug? Open an issue
  • ๐Ÿ’ก Have a feature request? Let's discuss it!
  • โญ Like the package? Star the repo to show your support
  • ๐Ÿ”ง Want to contribute? PRs are always welcome!

Try It Today!

npm install @nonsobarn/react-native-versatile-modal
Enter fullscreen mode Exit fullscreen mode

Then head over to the documentation to get started!

Final Thoughts

Building this package has been an incredible journey into the world of open source, API design, and developer experience. I hope this component saves you as much time and frustration as it's saved me, and I can't wait to see what you build with it!

What modal challenges have you faced in your React Native projects? Share your experiences in the comments below! ๐Ÿ‘‡


Resources:

ReactNative #JavaScript #TypeScript #OpenSource #MobileDevelopment #WebDevelopment #Programming #NPM #ReactNativeDevelopment

Top comments (0)