# react-native-popup-stub
**Repository Path**: UnPourTous/react-native-popup-stub
## Basic Information
- **Project Name**: react-native-popup-stub
- **Description**: A popup container for implements your own popups like ActionSheet, Dialog, Alert, Toast ...
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-02-13
- **Last Updated**: 2025-01-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# react-native-popup-stub
[](https://github.com/ellerbrock/open-source-badge/)
[](https://standardjs.com)
## Introduction
Popup global controller:
- Handle popup animations
- Remove old popup with the same `zIndex` automatically
- Make it easy to implement your own popup like Dialog, Toast, ActionSheet
- Support landscape and portrait automatically
Derived from @unpourtous/react-native-stub-toast/PopupStub.
Animation is based on [react-native-animatable](https://github.com/oblador/react-native-animatable)
### Demo

## Installation
```
npm install @unpourtous/react-native-popup-stub --save
```
## API Detail
### Props
PopupStub properties
| param | type | description |
| --- | --- | --- |
| maskColor | String | mask color, default 'rgba(23,26,35,0.6)' |
| maskAnimatable | Boolean | whether enable mask animation, default false |
| orientation | Enum | deprecated, no need any more |
### PopupStub.init(ref)
Init PopupStub with PopupStub reference.
| param | type | description |
| --- | --- | --- |
| ref | ref | should be the PopupStub component reference |
### PopupStub.addPopup(component, option)
Add popup to PopupStub, use option to controller actions for each Component/Layers.
| param | type | description |
| --- | --- | --- |
| component | Component | View component |
| option | Object | see below |
| .id | String | popup unique id, optional |
| .lock | Boolean | when locked, it will stop all clicks, default false |
| .mask | Boolean | has a visual mask or not, default true |
| .maskDuration | Integer | duration of mask animation (if enabled) |
| .autoClose | Boolean | enable clicking mask to close or not, default true |
| .closeCallback | Function | when close, it will support close callback |
| .enableClickThrough | Boolean | deprecated, use `lock` instead |
| .visible | Boolean | whether to render this popup, default true |
| .zIndex | Integer | priority of each popup in PopupStub, the bigger the higher |
| .position | Enum | position of element in screen, available: none, left, right, top, bottom, center (defualt) |
| .wrapperStyle | Object | animation wrapper style (each popup is wrapped in an Animatable.View) |
| .closingAnimation | Animation | by default, reversed animation |
| Animatable.props | -- | see [Animatable.props](https://github.com/oblador/react-native-animatable), direction and onAnimationEnd are reserved |
returns (String) unique id
*lock* changed a lot, from `Enum` to `Boolean`.
### PopupStub.removePopup(id)
Invoke popup exiting animation and remove it on animation end
| param | type | description |
| --- | --- | --- |
| id | String | popup unique id |
## Example
First, add PopupStub as sibling node of your Root Node
``` js
export default class example extends Component {
render () {
return (
{/* Your root node */}
{
// Step three: Use Toast with static function
Toast.show('This is a Toast')
Toast.show('This is another Toast')
}}>
Show Toast
{/* Step One: Add popup stub */}
{
// Step Two: Init PopupStub itself
if (_ref) PopupStub.init(_ref)
}} />
)
}
}
```
Then, just push your popup instance to PopupStub
```js
// Toast.js
export default class Toast extends Component {
static show (msg) {
const id = PopupStub.addPopup(, {
mask: false,
position: 'center',
zIndex: 500,
delay: 0,
duration: 100,
animation: 'fadeIn',
easing: 'ease'
})
// autoclose after 1.5s
setTimeout(() => {
PopupStub.removePopup(id)
}, 1500)
}
render () {
return (
{this.props.msg}
)
}
}
```
```js
// ActionSheet.js
export default class ActionSheet extends Component {
static _id
static show (choices) {
ActionSheet._id = PopupStub.addPopup(, {
mask: true,
zIndex: 300,
delay: 0,
duration: 100,
animation: {from: {translateY: 210}, to: {translateY: 0}},
easing: 'ease',
position: 'bottom',
// or the same, 100% width at the bottom of screen
// position: 'none',
// wrapperStyle: {position: 'absolute', left: 0, right: 0, bottom: 0}
})
}
static hide () {
PopupStub.removePopup(ActionSheet._id)
}
render () {
// as for demo, we ignore property choices here
return (
Option 1
Option 2
Option 3
ActionSheet.hide()}>Cancel
)
}
}
const styles = StyleSheet.create({
btn: {
backgroundColor: 'white',
height: 50,
alignItems: 'center',
justifyContent: 'center'
},
line: {
borderColor: '#ddd',
borderTopWidth: 1
}
})
```
## Todo
- [x] Each popup an independent mask, rather than share a visual one
- [ ] Support popup life circle callback or so
- [x] Enable mask animation
- [x] Enable remove animation in android
- [ ] Enable reversing any valid animations
- [ ] Enable to close popup with same zIndex by configuration
## License
This library is distributed under MIT Licence.
[](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2FUnPourTous%2Freact-native-popup-stub?ref=badge_large)