toastify-react-native
Version:
š toastify-react-native allows you to add notifications to your react-native app (ios, android) with ease. No more nonsense!
415 lines (351 loc) ā¢ 14.6 kB
Markdown
# toastify-react-native
[](https://badge.fury.io/js/toastify-react-native)
š toastify-react-native allows you to add notifications to your React Native app (iOS, Android) with ease. No more nonsense!
## Demo
## [View examples on snack.expo.io](https://snack.expo.io/@zahidalidev/toastify-react-native)
<video src="https://github.com/user-attachments/assets/14b6336e-44e5-41b5-83ea-94f8571f1eee" autoplay loop muted playsinline></video>
## Features
- š **Simple API**: Easy to use with minimal setup
- šØ **Highly customizable**: Customize colors, icons, animations, and more
- š§© **Custom components**: Create your own toast components
- š **Custom icons**: Use different icon families, custom icon components, or JSX elements
- š± **Responsive**: Adapts to different screen sizes
- š **Dark & Light mode**: Built-in theme support
- š **RTL support**: Right-to-left language support
- ā±ļø **Progress bar**: Visual indicator of toast duration
- šļø **Interactive**: Pause on touch, resume on release
- š **Animation options**: Choose from different animation styles
- š **Multiple lines**: Support for title and description
- š **TypeScript support**: Full type definitions included
- āØ **Smooth animations**: Beautiful enter/exit animations
- ā” **Quick setup**: Get up and running in less than 10 seconds!
- šļø **Per-toast behavior**: Define different behaviors for each toast
- š **Progress control**: Control the progress bar like nprogress
- š§ **Super easy to customize**: Modify every aspect to match your app's design
- š **And much more!**: Discover all the possibilities!
## Installation
```sh
npm install toastify-react-native
# or
yarn add toastify-react-native
```
### Required Dependencies
This package requires `react-native-vector-icons`:
```sh
npm install react-native-vector-icons
# or
yarn add react-native-vector-icons
```
Follow the [react-native-vector-icons installation guide](https://github.com/oblador/react-native-vector-icons#installation) to complete the setup for your platform.
## Basic Usage
```jsx
import React from 'react'
import { View, Button } from 'react-native'
import ToastManager, { Toast } from 'toastify-react-native'
export default function App() {
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Button
title='Show Success Toast'
onPress={() => {
Toast.success('Success message!')
}}
/>
<Button
title='Show Error Toast'
onPress={() => {
Toast.error('Error message!')
}}
/>
<Button
title='Show Info Toast'
onPress={() => {
Toast.info('Info message!')
}}
/>
<Button
title='Show Warning Toast'
onPress={() => {
Toast.warn('Warning message!')
}}
/>
{/* Toast provider should be at the root level */}
<ToastManager />
</View>
)
}
```
## Advanced Usage
### Custom Configuration
```jsx
import React from 'react'
import { View, Button, Text } from 'react-native'
import ToastManager, { Toast } from 'toastify-react-native'
// Custom toast configuration
const toastConfig = {
success: (props) => (
<View style={{ backgroundColor: '#4CAF50', padding: 16, borderRadius: 10 }}>
<Text style={{ color: 'white', fontWeight: 'bold' }}>{props.text1}</Text>
{props.text2 && <Text style={{ color: 'white' }}>{props.text2}</Text>}
</View>
),
// Override other toast types as needed
}
export default function App() {
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Button
title='Show Custom Toast'
onPress={() => {
Toast.show({
type: 'success',
text1: 'Main message',
text2: 'Secondary message',
position: 'bottom',
visibilityTime: 4000,
autoHide: true,
onPress: () => console.log('Toast pressed'),
onShow: () => console.log('Toast shown'),
onHide: () => console.log('Toast hidden'),
})
}}
/>
{/* Toast provider with custom config */}
<ToastManager config={toastConfig} />
</View>
)
}
```
### Toast Positions
```jsx
Toast.success('Top toast', 'top') // default
Toast.error('Center toast', 'center')
Toast.info('Bottom toast', 'bottom')
```
### Customizing Individual Toasts
```jsx
Toast.show({
type: 'success',
text1: 'Custom Toast',
text2: 'With many options',
position: 'bottom',
visibilityTime: 5000,
autoHide: true,
backgroundColor: '#333',
textColor: '#fff',
iconColor: '#4CAF50',
iconSize: 24,
progressBarColor: '#4CAF50',
theme: 'dark',
})
```
## Available Props
### ToastManager Props
| Prop | Type | Default | Description |
| --------------- | ----------------------------- | ---------- | -------------------------------------------------- |
| width | number \| string \| 'auto' | '90%' | Width of the toast |
| minHeight | number \| string \| 'auto' | 61 | Minimum height of the toast |
| style | StyleProp<ViewStyle> | {} | Custom style for the toast container |
| textStyle | StyleProp<TextStyle> | {} | Custom style for the toast text |
| theme | 'light' \| 'dark' | 'light' | Theme of the toast |
| animationStyle | 'none' \| 'slide' \| 'fade' | 'fade' | Animation style for the toast |
| position | 'top' \| 'center' \| 'bottom' | 'top' | Position of the toast |
| duration | number | 3000 | Duration in ms before the toast disappears |
| showCloseIcon | boolean | true | Whether to show the close icon |
| showProgressBar | boolean | true | Whether to show the progress bar |
| isRTL | boolean | false | Right-to-left support |
| topOffset | number | 40 | Distance from the top when position is 'top' |
| bottomOffset | number | 40 | Distance from the bottom when position is 'bottom' |
| iconSize | number | 22 | Size of the icon |
| iconFamily | string | 'Ionicons' | Default icon family to use |
| icons | object | undefined | Custom default icons for each toast type |
| config | ToastConfig | undefined | Custom toast components configuration |
### Toast.show() Options
| Option | Type | Default | Description |
| ---------------- | ----------------------------------------------------- | --------- | ------------------------------------------- |
| type | 'success' \| 'error' \| 'info' \| 'warn' \| 'default' | 'default' | Type of toast |
| text1 | string | '' | Main text |
| text2 | string | undefined | Secondary text |
| position | 'top' \| 'center' \| 'bottom' | 'top' | Position of the toast |
| visibilityTime | number | 3000 | Duration in ms before the toast disappears |
| autoHide | boolean | true | Whether the toast should hide automatically |
| onShow | () => void | undefined | Callback when toast is shown |
| onHide | () => void | undefined | Callback when toast is hidden |
| onPress | () => void | undefined | Callback when toast is pressed |
| progressBarColor | string | undefined | Color of the progress bar |
| backgroundColor | string | undefined | Background color of the toast |
| textColor | string | undefined | Color of the text |
| icon | string \| ReactNode | undefined | Custom icon name or component |
| iconFamily | string | undefined | Icon family for the icon |
| iconColor | string | undefined | Color of the icon |
| iconSize | number | undefined | Size of the icon |
| theme | 'light' \| 'dark' | undefined | Theme of the toast |
## Custom Components
You can create your own toast components by providing a custom configuration:
```jsx
import React from 'react'
import { View, Text, StyleSheet } from 'react-native'
import ToastManager, { Toast } from 'toastify-react-native'
import Icon from 'react-native-vector-icons/MaterialIcons'
const CustomToast = ({ text1, text2, hide }) => {
return (
<View style={styles.customToast}>
<Icon name='star' size={24} color='#FFD700' />
<View style={styles.textContainer}>
<Text style={styles.title}>{text1}</Text>
{text2 && <Text style={styles.message}>{text2}</Text>}
</View>
<Icon name='close' size={20} color='#fff' onPress={hide} />
</View>
)
}
const styles = StyleSheet.create({
customToast: {
width: '90%',
backgroundColor: '#673AB7',
borderRadius: 10,
padding: 16,
flexDirection: 'row',
alignItems: 'center',
shadowColor: '#000',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.25,
shadowRadius: 3.84,
elevation: 5,
},
textContainer: {
flex: 1,
marginLeft: 12,
},
title: {
color: '#fff',
fontWeight: 'bold',
fontSize: 16,
},
message: {
color: '#fff',
fontSize: 14,
marginTop: 4,
},
})
export default function App() {
const toastConfig = {
custom: (props) => <CustomToast {...props} />,
}
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Button
title='Show Custom Toast'
onPress={() => {
Toast.show({
type: 'custom',
text1: 'Custom Component',
text2: 'This is a fully custom toast component!',
})
}}
/>
<ToastManager config={toastConfig} />
</View>
)
}
```
## Customizing Icons
```jsx
// Different icon name from the default family
Toast.show({
type: 'success',
text1: 'Different Icon',
text2: 'Using a different icon name',
icon: 'check', // Different icon name according to default icon family
})
// Using a different icon family
Toast.show({
type: 'error',
text1: 'FontAwesome Icon',
text2: 'Using a different icon family',
icon: 'exclamation-circle',
iconFamily: 'FontAwesome',
})
// Using a custom React component as icon
const CustomIcon = ({ color }) => (
<View
style={{
width: 30,
height: 30,
borderRadius: 15,
backgroundColor: color || '#4CAF50',
alignItems: 'center',
justifyContent: 'center',
}}
>
<FontAwesome name='check' size={18} color='#FFFFFF' />
</View>
)
Toast.show({
type: 'info',
text1: 'Custom Component',
text2: 'Using a custom React component as icon',
icon: <CustomIcon color='#3498db' />,
})
// Using JSX directly as icon
Toast.show({
type: 'success',
text1: 'JSX Icon',
text2: 'Using JSX directly as icon',
icon: (
<View style={{ flexDirection: 'row' }}>
<FontAwesome name='thumbs-up' size={22} color='#4CAF50' />
<FontAwesome
name='thumbs-up'
size={22}
color='#4CAF50'
style={{ marginLeft: -8, marginTop: 5 }}
/>
</View>
),
})
```
```jsx
// Setting default icons at the ToastManager level
<ToastManager
config={toastConfig}
theme='light'
position='top'
// Custom default icons configuration
icons={{
success: 'check-circle',
error: 'error',
info: 'info',
warn: 'warning',
default: 'notifications',
}}
// Default icon family
iconFamily='MaterialIcons'
// Default icon size
iconSize={24}
/>
```
## API Reference
### Toast Functions
- `Toast.show(options)`: Show a toast with custom options
- `Toast.success(message, position?)`: Show a success toast
- `Toast.error(message, position?)`: Show an error toast
- `Toast.info(message, position?)`: Show an info toast
- `Toast.warn(message, position?)`: Show a warning toast
- `Toast.hide()`: Hide the current toast
## Upgrading from v6.x
If you're upgrading from version 6.x, please note the following changes:
- The animation system has been simplified to use React Native's built-in Modal animations
- Some props have been removed or renamed for clarity
- The styling system has been improved for better customization
- Custom components now receive more props for better control
For users of v6.x and below, refer to the [legacy documentation](./README-legacy.md).
## Contributing
We welcome contributions to make toastify-react-native even better!
- Check out our [contribution guidelines](./CONTRIBUTING.md) for details on the process
- Have questions? Open an issue or join the discussion
- Found a bug? Submit a pull request
- Have a feature request? Open an issue
Thank you to all our contributors!
## License
toastify-react-native is [MIT licensed](https://github.com/zahidalidev/toastify-react-native/blob/master/LICENSE).