# react-native-message-bar

![npm version](http://img.shields.io/npm/dm/react-native-message-bar.svg)
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/482dc013717642e3971f78b22f2a95fd)](https://www.codacy.com/app/ktgr45/react-native-message-bar?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=KBLNY/react-native-message-bar&amp;utm_campaign=Badge_Grade)
![downloads](https://img.shields.io/npm/v/react-native-message-bar.svg) ![license](https://img.shields.io/npm/l/react-native-message-bar.svg)
[![Platform](https://img.shields.io/badge/platform-ios%20%7C%20android-989898.svg?style=flat-square)](https://npmjs.org/package/react-native-message-bar "View this project on npm")

A message bar notification component displayed at the top of the screen for React Native (Android and iOS) projects.

Originally created by [KBLNY](https://github.com/KBLNY/) now maintained by [Talor Anderson](https://github.com/talor-a/)

![Screenshot](http://s31.postimg.org/cxq6x5srf/Untitled.gif)


## Content
- [Features](#features)
- [Installation](#installation)
- [Basic Usage](#basic-usage)
- [Hide the Message Bar Alert](#hide-the-message-bar-alert)
- [Customize Alert Type](#customize-alert-type)
- [Customize Alert Content](#customize-alert-content)
- [Customize View Layout](#customize-view-layout)
- [Customize Position and Animation, Twitter Style!](#customize-position-and-animation-twitter-style)
- [Properties](#properties)
- [Contributing](#contributing)
- [TODOS](#todos)
- [Apps using this library](#apps-using-this-library)
- [License](#license)


## Features
- Android and iOS capable
- Animated alert with Title, Message and Icon/Avatar (from a local or a remote image file)
- Top or Bottom display
- 4 Slides Animation Types (Alert is shown from top, from bottom, from left or from right)
- Auto-hide after x seconds (customizable and/or can be disabled)
- Auto-hide current alert to display a newer one, if context requires to do so
- Support hide on tap (can be disabled)
- 4 pre-configured customizable styles + 1 extra
- Customizable texts, styles, durations, positions and animation
- Callbacks on alert show, hide and tap
- Orientation supported
- Children component support Show/Hide alert


## Installation
Make sure that you are in your React Native project directory and run:
```batch
$ npm install react-native-message-bar --save
```


## Basic Usage
- 1. Import the `react-native-message-bar` package
```javascript
var MessageBarAlert = require('react-native-message-bar').MessageBar;
var MessageBarManager = require('react-native-message-bar').MessageBarManager;
```

- 2. Add the `MessageBarAlert` to your render function
Note: Add it at the very end of your render function, the alert will then be displayed over any component of the view
```javascript
// Within your render function.
// Include the MessageBar once within your top View element
// Make sure you add the MessageBar at the very bottom of your master component, then it will be displayed over all other components
<MessageBarAlert ref="alert" />
```

- 3. Register and Release your Message Bar as the current main alert
```javascript
componentDidMount() {
  // Register the alert located on this master page
  // This MessageBar will be accessible from the current (same) component, and from its child component
  // The MessageBar is then declared only once, in your main component.
  MessageBarManager.registerMessageBar(this.refs.alert);
}

componentWillUnmount() {
  // Remove the alert located on this master page from the manager
  MessageBarManager.unregisterMessageBar();
}
```

- 4. Display the Message Bar Alert on demand
```javascript
// Call this method after registering your MessageBar as the current alert
// By calling this method the registered alert will be displayed
// This is useful to show the alert from your current page or a child component
MessageBarManager.showAlert({
  title: 'Your alert title goes here',
  message: 'Your alert message goes here',
  alertType: 'success',
  // See Properties section for full customization
  // Or check `index.ios.js` or `index.android.js` for a complete example
});
```
Please note, if you do not provide a `alertType`, the `info` one will be chosen for you.

The normal `duration` of the notification is 3 seconds (3000 ms), you can override it. After this time, the notification is going to be hidden


See a full Example in `index.ios.js` or `index.android.js`.


## Hide the Message Bar Alert
```javascript
// You can force the current alert to be hidden through the Manager
MessageBarManager.hideAlert();
```


## Customize Alert Type
The Message Bar Alert comes with 4 pre-configured alert style and 1 undefined extra.
These alert styles defined the background color of the alert and the line stroke color.
The 4 pre-configured alert styles are:
- `info` defined blue colors
- `success` defined green colors
- `warning` defined orange colors
- `error` defined red colors

The `extra` alert type allows you to use another 5th type.

```javascript
MessageBarManager.showAlert({
  ...

  alertType: 'info', // Alert Type: you can select one of 'success', 'error', 'warning', 'error', or 'custom' (use custom if you use a 5th stylesheet, all are customizable). Default is 'info'

  /* Customize the stylesheets and/or provide an additional one 'extra' */
  stylesheetInfo : {{ backgroundColor : '#007bff', strokeColor : '#006acd',
                      titleColor: '#ffffff', messageColor: '#ffffff' }}, // Default are blue colors with white title and message
  stylesheetSuccess : {{ backgroundColor : 'darkgreen', strokeColor : '#b40000',
                         titleColor: '#ffffff', messageColor: '#ffffff' }}, // Default are Green colors with white title and message
  stylesheetWarning : {{ backgroundColor : '#ff9c00', strokeColor : '#f29400',
                         titleColor: '#ffffff', messageColor: '#ffffff' }}, // Default are orange colors with white title and message
  stylesheetError : {{ backgroundColor : '#ff3232', strokeColor : '#FF0000',
                         titleColor: '#ffffff', messageColor: '#ffffff' }}, // Default are red colors with white title and message
  stylesheetExtra : {{ backgroundColor : 'black', strokeColor : 'gray',
                         titleColor: '#ffffff', messageColor: '#ffffff' }}, // Default are blue colors with white title and message, same as info

  ...
});
```


## Customize Alert Content
You can customize the style of the Title, Message and Icon/Avatar.
```javascript
MessageBarManager.showAlert({
  ...

  title: "John Doe", // Title of the alert
  message: "Hello, any suggestions?", // Message of the alert
  avatar: "<URL/require('<path>') of your icon/avatar>", // Avatar/Icon <URL> of the alert or enter require('LOCALPATH') for local image

  /* Number of Lines for Title and Message */
  titleNumberOfLines: 1,
  messageNumberOfLines: 0, // Unlimited number of lines

  /* Style for the text elements and the  */
  titleStyle: {{ color: 'white', fontSize: 18, fontWeight: 'bold' }},
  messageStyle: {{ color: 'white', fontSize: 16 }},
  avatarStyle: {{ height: 40, width: 40, borderRadius: 20 }},

  ...
});
```


## Customize Message Bar Alert Layout
You can customize the inset (padding) and the offset of the alert.
```javascript
MessageBarManager.showAlert({
  ...

  /* Offset of the View, useful if you have a navigation bar or if you want the alert be shown below another component instead of the top of the screen */
  viewTopOffset : 0, // Default is 0
  viewLeftOffset : 0, // Default is 0
  viewRightOffset : 0, // Default is 0

  /* Inset of the view, useful if you want to apply a padding at your alert content */
  viewTopInset : 15, // Default is 0
  viewLeftInset : 0, // Default is 0
  viewRightInset : 0, // Default is 0

  ...
});
```


## Customize Position and Animation, Twitter Style!
You can choose the position (`top`or `bottom`) of the alert.
You can choose the way the alert is shown (`SlideFromTop`, `SlideFromBottom`, `SlideFromLeft` or `SlideFromRight`).
```javascript
MessageBarManager.showAlert({
  ...

  /* Position of the alert and Animation Type the alert is shown */
  position: 'bottom',
  animationType: 'SlideFromLeft',

  ...
});
```


## Setting default values for an alert reference
Default values (for style etc.) can be set when `MessageBarAlert` is added to your render function e.g.:
```javascript
<MessageBarAlert
  ref="alert"
  titleStyle={{
    fontSize: 36,
    fontWeight: 'bold'
  }}
  messageStyle={{
    fontSize: 28
  }}
  duration={6000}
  viewTopOffset={10}
  stylesheetSuccess={{
    backgroundColor: '#52d80f',
    strokeColor: '#43c90e',
    titleColor: '#ffffff',
    messageColor: '#ffffff'
  }}
/>
```
These values override the built-in default values and hold for all `MessageBarManager.showAlert()` calls on the same reference.
All properties except `title`, `message`, `avatar`, and `alertType` can be set in render.


## Properties
Prop                  | Type     | Default              | Description
--------------------- | -------- | -------------------- | -----------
title                 | String   |                      | Title of the alert
message               | String   |                      | Message of the alert
avatar                | String   |                      | Avatar/Icon source/URL of the alert. Use <URL> for a remote image file (eg `avatar: 'http://mywebsite.com/myimage.jpg'`) or use `avatar: require('<path/to/my/local/image.extension>')` for a remote image file
alertType             | String   | info                 | Alert Type: you can select one of 'success', 'error', 'warning', 'error', or 'custom' (use custom if you use a 5th stylesheet, all are customizable).
duration              | Number   | 3000                 | Number of ms the alert is displayed
shouldHideAfterDelay  | Bool     | true                 | Tell the MessageBar whether or not it should hide after a delay defined in the `duration` property. If `false`, the MessageBar remain shown
shouldHideOnTap       | Bool     | true                 | Tell the MessageBar whether or not it should hide or not when the user tap the alert. If `false`, the MessageBar will not hide, but the `onTapped` function is triggered, if defined. In addition, if `false`, the `onHide` function will not be triggered. The property `shouldHideAfterDelay` take precedence over `shouldHideOnTap`. That means if `shouldHideAfterDelay` is `false`, the value of `shouldHideOnTap` is not taken into account, since the MessageBar will not ever be hidden
onTapped              | Function |                      | Callback function after alert is tapped
onShow                | Function |                      | Callback function after alert is shown
onHide                | Function |                      | Callback function after alert is hidden
stylesheetInfo        | Object   | { backgroundColor: '#007bff', strokeColor: '#006acd' } | Background color and line stroke colors of the alert when alertType is equals to `info`
stylesheetSuccess     | Object   | { backgroundColor: 'darkgreen', strokeColor: '#b40000' } | Background color and line stroke colors of the alert when alertType is equals to `success`
stylesheetWarning     | Object   | { backgroundColor: '#ff9c00', strokeColor: '#f29400' } | Background color and line stroke colors of the alert when alertType is equals to `warning`
stylesheetError       | Object   | { backgroundColor: '#ff3232', strokeColor: '#FF0000' } | Background color and line stroke colors of the alert when alertType is equals to `error`
stylesheetExtra       | Object   | { backgroundColor: '#007bff', strokeColor: '#006acd' } | Background color and line stroke colors of the alert when alertType is equals to `extra`
durationToShow        | Number   | 350                  | Duration of the animation to completely show the alert
durationToHide        | Number   | 350                  | Duration of the animation to completely hide the alert
viewTopOffset         | Number   | 0                    | Offset of the view from the top. That means the alert touch the top edge of the screen.
viewBottomOffset      | Number   | 0                    | Offset of the view from the bottom. That means the alert touch the bottom edge of the screen
viewLeftOffset        | Number   | 0                    | Offset of the view from the left. That means the alert touch the left edge of the screen
viewRightOffset       | Number   | 0                    | Offset of the view from the right. That means the alert touch the right edge of the screen
viewTopInset          | Number   | 0                    | Padding Top of the view
viewBottomInset       | Number   | 0                    | Padding Bottom of the view
viewLeftInset         | Number   | 0                    | Padding Left of the view
viewRightInset        | Number   | 0                    | Padding Right of the view
titleNumberOfLines    | Number   | 1                    | Number of lines of the title. `0` means unlimited
messageNumberOfLines  | Number   | 2                    | Number of lines of the message. `0` means unlimited
avatarStyle           | Style    | { height: 40, width: 40, borderRadius: 20, alignSelf: 'center' } | Style of the icon/avatar
titleStyle            | Style    | { color: 'white', fontSize: 18, fontWeight: 'bold' } | Style of the title
messageStyle          | Style    | { color: 'white', fontSize: 16 } | Style of the message
position              | String   | top                  | Define the position of the alert, can be `top` or `right`
animationType         | String   | SlideFromTop         | Define the way the alert is animated on the view, can be `SlideFromTop`, `SlideFromBottom`, `SlideFromLeft` or `SlideFromRight`. If no value is specified, the animation type is selected for you based on the `position`; `SlideFromTop` if `position` is equal to `top`, `SlideFromBottom` if `position` is equal to `bottom`. The alert will then be smoothly displayed
children              | Object   | null                 | Children components to render beneath the message bar content


## Contributing
1. Fork this Repo first
2. Clone your Repo
3. Install dependencies by $ npm install
4. Checkout a feature branch
5. Feel free to add your features
6. Make sure your features are fully tested
7. Publish your local branch, Open a pull request
8. Enjoy hacking <3


## TODOS
- [ ] Add Alert Queuing System
- [x] Add Bottom Position
- [x] Add Slide Animations Type (Slide from Top, Bottom, Left, Right)
- [ ] Add Other Animations Type (Fade-in, Elastic, etc.)
- [ ] Add customizable Animation (inject your configuration)
- [ ] Anything that can help to improve :) Thanks for contributions


## Apps using this library
- Your App here...


---

## License
`React-Native-Message-Bar` is released under MIT License. See `LICENSE` for details.

>**Copyright &copy; 2016 KBLNY.**

*Please provide attribution, it is greatly appreciated.*
