A powerful React Native library for handling native share intents on iOS and Android. Built with Nitro Modules for optimal performance. Handle text sharing, file sharing, and multiple file sharing from other apps.
npm install react-native-nitro-share-intentA powerful React Native library for handling native share intents on iOS and Android, built with Nitro Modules for optimal performance and developer experience.
!React Native
!Platform
!License
!Version
- 🔗 Native Share Intent Handling - Seamlessly handle share intents from other apps
- 📱 Cross-Platform Support - Works on both iOS and Android
- 📄 Multiple File Types - Support for text, single files, and multiple files
- 🎯 TypeScript Ready - Full TypeScript support with comprehensive type definitions
- ⚡ Nitro Modules Powered - High-performance native module architecture
- 🔄 Real-time Listening - Listen for share intents in real-time
- 📊 Rich Metadata - Extract file metadata (dimensions, duration, size, etc.)
- 🎨 Utility Functions - Helper utilities for common share intent operations
``bash`
npm install react-native-nitro-share-intent react-native-nitro-modules
> Note: react-native-nitro-modules is required as this library relies on Nitro Modules.
1. Add to AppDelegate.swift:
`swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Your existing code...
// Notify NitroShareIntent about app launch
NotificationCenter.default.post(name: NSNotification.Name("AppDidFinishLaunching"), object: nil)
return true
}
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
// Handle share intent URLs
NotificationCenter.default.post(
name: NSNotification.Name("ShareIntentReceived"),
object: nil,
userInfo: ["url": url]
)
return true
}
`
2. Configure URL Schemes in Info.plist:
`xml`
1. Add to MainActivity.java/kt:
`kotlin
import com.margelo.nitro.nitroshareintent.NitroShareIntent
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Your existing code...
// Handle initial share intent
NitroShareIntent.instance.handleIntent(intent)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
// Handle new share intents
NitroShareIntent.instance.handleIntent(intent)
}
`
2. Configure Intent Filters in AndroidManifest.xml:
`xml
android:exported="true"
android:launchMode="singleTop">
`
`typescript
import React, { useState } from 'react';
import { View, Text, ScrollView } from 'react-native';
import { useShareIntent, SharePayload, ShareIntentUtils } from 'react-native-nitro-share-intent';
const App = () => {
const [shares, setShares] = useState
// Listen for share intents
useShareIntent((payload: SharePayload) => {
console.log('Received share:', payload);
setShares(prev => [...prev, payload]);
});
return (
Share Intent Demo
{shares.map((share, index) => (
Type: {share.type.toUpperCase()}
{ShareIntentUtils.isTextShare(share) && (
)}
{ShareIntentUtils.isFileShare(share) && (
)}
{share.extras && Object.keys(share.extras).length > 0 && (
Extras: {JSON.stringify(share.extras)}
)}
))}
);
};
export default App;
`
`typescript
import { getInitialShare, SharePayload } from 'react-native-nitro-share-intent';
// Get the initial share when the app opens
const handleAppStart = async () => {
const initialShare = await getInitialShare();
if (initialShare) {
console.log('Initial share:', initialShare);
// Handle the initial share
}
};
`
#### useShareIntent(callback: (payload: SharePayload) => void)
A React hook that listens for incoming share intents.
`typescript`
useShareIntent((payload) => {
// Handle the received share
console.log('Share received:', payload);
});
#### getInitialShare(): Promise
Retrieves the initial share intent when the app is opened via a share action.
`typescript`
const initialShare = await getInitialShare();
if (initialShare) {
// Handle the initial share
}
#### SharePayload
`typescript`
type SharePayload = {
type: ShareType; // 'text' | 'file' | 'multiple'
text?: string; // Shared text content
files?: string[]; // Array of file URIs
extras?: Record
};
#### ShareType
`typescript`
type ShareType = 'text' | 'file' | 'multiple';
#### ShareIntentUtils
A collection of helper functions for working with share payloads:
`typescript
import { ShareIntentUtils } from 'react-native-nitro-share-intent';
// Check share type
ShareIntentUtils.isTextShare(payload); // Returns boolean
ShareIntentUtils.isFileShare(payload); // Returns boolean
ShareIntentUtils.isMultipleFileShare(payload); // Returns boolean
// Extract metadata
ShareIntentUtils.getSubject(payload); // Returns string | undefined
ShareIntentUtils.getAdditionalText(payload); // Returns string | undefined
// File type detection
ShareIntentUtils.isImageFile(fileUri); // Returns boolean
ShareIntentUtils.isVideoFile(fileUri); // Returns boolean
ShareIntentUtils.getFileExtension(fileUri); // Returns string | undefined
// Display formatting
ShareIntentUtils.formatForDisplay(payload); // Returns formatted string
`
`typescript
import {
useShareIntent,
ShareIntentUtils,
SharePayload,
} from 'react-native-nitro-share-intent';
const ShareHandler = () => {
useShareIntent((payload: SharePayload) => {
if (ShareIntentUtils.isTextShare(payload)) {
console.log('Text shared:', payload.text);
} else if (ShareIntentUtils.isFileShare(payload)) {
if (ShareIntentUtils.isMultipleFileShare(payload)) {
console.log('Multiple files shared:', payload.files?.length);
} else {
console.log('Single file shared:', payload.files?.[0]);
const fileUri = payload.files?.[0];
if (fileUri && ShareIntentUtils.isImageFile(fileUri)) {
console.log("It's an image file!");
}
}
}
});
return null;
};
`
`typescriptFile ${index + 1}:
useShareIntent((payload: SharePayload) => {
if (payload.files && payload.files.length > 0) {
payload.files.forEach((fileUri, index) => {
console.log(, {
uri: fileUri,
extension: ShareIntentUtils.getFileExtension(fileUri),
isImage: ShareIntentUtils.isImageFile(fileUri),
isVideo: ShareIntentUtils.isVideoFile(fileUri),
});
});
}
if (payload.extras) {
console.log('File metadata:', {
fileName: payload.extras.fileName,
fileSize: payload.extras.fileSize,
mimeType: payload.extras.mimeType,
dimensions:
payload.extras.width && payload.extras.height
? ${payload.extras.width}x${payload.extras.height}`
: 'N/A',
duration: payload.extras.duration,
});
}
});
- Share content from other apps to your social media platform
- Handle image/video sharing from gallery apps
- Process text sharing from browsers or messaging apps
- Import images/videos from other apps
- Handle file sharing for editing purposes
- Process multiple file selections
- File management and organization
- Content processing and conversion
- Cross-app workflow automation
1. Share intent not working on Android
- Ensure proper intent filters in AndroidManifest.xml
- Check that your app is set as the default handler for the share types
2. Files not accessible on iOS
- Verify app has proper permissions for file access
- Check that file types are supported in your app's configuration
3. Initial share not detected
- Use getInitialShare() to capture shares when the app is opened via share intent
- Ensure your app is properly configured to handle the share types
`typescript`
useShareIntent((payload) => {
console.log('Share Intent Debug:', {
type: payload.type,
text: payload.text,
files: payload.files,
extras: payload.extras,
});
});
We welcome contributions! Please see our Contributing Guide for details.
1. Fork the repository
2. Create a feature branch: git checkout -b feature/amazing-featuregit commit -m 'Add amazing feature'
3. Commit your changes: git push origin feature/amazing-feature`
4. Push to the branch:
5. Open a pull request
Please read our Code of Conduct before contributing.
This project is licensed under the MIT License - see the LICENSE file for details.
- Built with Nitro Modules for superior performance
- Inspired by the React Native community's need for robust share intent handling
- Thanks to all contributors who help improve this library
---
Made with ❤️ by Yogesh Solanki
If you find this library helpful, please consider giving it a ⭐ on GitHub!