Skip to content

Commit aae7c9f

Browse files
author
Maxim Yaskevich
authored
Merge pull request #3 from myaskevich/2.x
Added new showModal event
2 parents d933392 + 4049b4e commit aae7c9f

File tree

10 files changed

+94
-36
lines changed

10 files changed

+94
-36
lines changed

README.md

Lines changed: 57 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,55 @@
77
npm i --save react-redux-modal-provider
88
```
99

10+
## What's new in `v2`
11+
12+
No need to use `connect()` anymore!
13+
14+
### Before:
15+
16+
```jsx
17+
// app.jsx
18+
import { connect } from 'react-redux';
19+
import { showModal } from 'react-redux-modal-provider';
20+
import MyModal from './myModal';
21+
22+
const App = (props) => (
23+
<div>
24+
<p>
25+
Hello world
26+
</p>
27+
<button
28+
type="button"
29+
onClick={() => props.showModal(MyModal, { message: 'Hello' })}>
30+
Present modal
31+
</button>
32+
</div>
33+
);
34+
35+
export default connect(null, { showModal })(App);
36+
```
37+
38+
### After:
39+
40+
```jsx
41+
// app.jsx
42+
import { showModal } from 'react-redux-modal-provider';
43+
import MyModal from './myModal';
44+
45+
export default (props) => (
46+
<div>
47+
<p>
48+
Hello world
49+
</p>
50+
<button
51+
type="button"
52+
onClick={() => showModal(MyModal, { message: 'Hello' })}>
53+
Present modal
54+
</button>
55+
</div>
56+
);
57+
```
58+
1059
## Usage
1160

1261
#### 1. Add `<ModalProvider>` to your root component.
@@ -38,24 +87,22 @@ export default combineReducers({
3887
#### 3. Add modal creation code.
3988

4089
```jsx
41-
import { connect } from 'react-redux';
90+
// app.jsx
4291
import { showModal } from 'react-redux-modal-provider';
4392
import MyModal from './myModal';
4493

45-
const App = (props) => (
94+
export default (props) => (
4695
<div>
4796
<p>
4897
Hello world
4998
</p>
5099
<button
51100
type="button"
52-
onClick={() => props.showModal(MyModal, { message: 'Hello' })}>
101+
onClick={() => showModal(MyModal, { message: 'Hello' })}>
53102
Present modal
54103
</button>
55104
</div>
56105
);
57-
58-
export default connect(null, { showModal })(App);
59106
```
60107

61108
#### 4. Handle modal closing.
@@ -101,7 +148,7 @@ export default render(
101148

102149
### `SingleModalProvider`
103150

104-
One modal at a time. Each new modal triggers `hideModal` on previous modal.
151+
One modal at a time. Each new modal triggers `hideModal` on previous one.
105152

106153
```jsx
107154
import { SingleModalProvider } from 'react-redux-modal-provider';
@@ -124,7 +171,10 @@ export default render(
124171
2. No need to `connect()` your modal component to Redux, unless you want it to be able to create other modals itself.
125172

126173
## Acknowledgements
127-
Thanks [@yesmeck](https://github.com/yesmeck), author of [`redux-modal`](https://github.com/yesmeck/redux-modal), for webpack config I borrowed.
174+
175+
* Thanks [@yesmeck](https://github.com/yesmeck), author of [`redux-modal`](https://github.com/yesmeck/redux-modal), for webpack config I borrowed.
176+
177+
* Thanks [@diegoddox](https://github.com/diegoddox), author of [`react-redux-toastr`](https://github.com/diegoddox/react-redux-toastr), for the idea how to dispatch actions from anywhere using `EventEmitter`.
128178

129179
## License
130180
MIT

example/src/app.js

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import React, {Component, PropTypes} from 'react';
2-
import {connect} from 'react-redux';
3-
import {showModal} from 'react-redux-modal-provider';
1+
import React, { Component } from 'react';
2+
import { showModal } from 'react-redux-modal-provider';
43

54
import ExampleModal from './exampleModal';
65

@@ -25,7 +24,7 @@ class App extends Component {
2524
<button
2625
type="button"
2726
className="btn btn-primary btn-lg"
28-
onClick={() => this.props.showModal(ExampleModal, {
27+
onClick={() => showModal(ExampleModal, {
2928
message: this.state.message
3029
})}>
3130
Launch demo modal
@@ -36,10 +35,4 @@ class App extends Component {
3635
}
3736
}
3837

39-
App.propTypes = {
40-
showModal: PropTypes.func.isRequired,
41-
}
42-
43-
export default connect(null, {
44-
showModal,
45-
})(App);
38+
export default App;

example/src/exampleModal.js

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
import React, { PropTypes } from 'react';
2-
import { connect } from 'react-redux';
32
import { Button, Modal } from 'react-bootstrap';
43
import { showModal } from 'react-redux-modal-provider';
54

6-
let ExampleModal;
7-
8-
const ExampleModalComponent = props => (
5+
const ExampleModal = props => (
96
<Modal show={props.show}>
107
<Modal.Header>
118
<Modal.Title>Hello {props.index}</Modal.Title>
@@ -19,7 +16,7 @@ const ExampleModalComponent = props => (
1916
<Button onClick={props.hideModal}>Close</Button>
2017
<Button
2118
bsStyle="primary"
22-
onClick={() => props.showModal(ExampleModal, {
19+
onClick={() => showModal(ExampleModal, {
2320
index: props.index + 1,
2421
message: props.message,
2522
})}
@@ -30,20 +27,15 @@ const ExampleModalComponent = props => (
3027
</Modal>
3128
);
3229

33-
ExampleModalComponent.propTypes = {
30+
ExampleModal.propTypes = {
3431
show: PropTypes.bool.isRequired,
3532
hideModal: PropTypes.func.isRequired,
36-
showModal: PropTypes.func.isRequired,
3733
index: PropTypes.number,
3834
message: PropTypes.string.isRequired,
3935
}
4036

41-
ExampleModalComponent.defaultProps = {
37+
ExampleModal.defaultProps = {
4238
index: 1,
4339
};
4440

45-
ExampleModal = connect(null, { showModal })(ExampleModalComponent);
46-
47-
const ExampleModalToExport = ExampleModal;
48-
49-
export default ExampleModalToExport;
41+
export default ExampleModal;

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-redux-modal-provider",
3-
"version": "1.1.1",
3+
"version": "2.0.0",
44
"description": "Redux-powered abstract React modal state manager",
55
"main": "lib/index.js",
66
"scripts": {
@@ -54,5 +54,7 @@
5454
"react-redux": "^5.0.3",
5555
"redux": "^3.6.0"
5656
},
57-
"dependencies": {}
57+
"dependencies": {
58+
"eventemitter3": "^2.0.3"
59+
}
5860
}

src/baseModalProvider.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
import React, { Component, PropTypes } from 'react';
22

3+
import eventEmitter from './eventEmitter';
4+
35
export default class BaseModalProvider extends Component {
6+
componentWillMount() {
7+
eventEmitter.on('showModal', (args) => this.props.showModal(...args));
8+
}
9+
10+
componentWillUnmount() {
11+
eventEmitter.removeListener('showModal');
12+
}
13+
414
hideModal(id) {
515
this.props.hideModal(id);
616
setTimeout(
@@ -28,6 +38,7 @@ export default class BaseModalProvider extends Component {
2838
}
2939

3040
BaseModalProvider.propTypes = {
41+
showModal: PropTypes.func.isRequired,
3142
hideModal: PropTypes.func.isRequired,
3243
removeModal: PropTypes.func.isRequired,
3344
modalProvider: PropTypes.shape({

src/eventEmitter.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
import EventEmitter from 'eventemitter3';
3+
4+
export default new EventEmitter();

src/events.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
import eventEmitter from './eventEmitter';
3+
4+
export default (...args) => eventEmitter.emit('showModal', args);

src/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ export default from './stackableModalProvider';
22
export StackableModalProvider from './stackableModalProvider';
33
export SingleModalProvider from './singleModalProvider';
44

5-
export { showModal } from './action';
5+
export showModal from './events';
66

77
export reducer from './reducer';

src/singleModalProvider.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { connect } from 'react-redux';
22

3-
import { hideModal, removeModal } from './action';
3+
import { showModal, hideModal, removeModal } from './action';
44
import BaseModalProviderComponent from './baseModalProvider';
55

66
class SingleModalProvider extends BaseModalProviderComponent {
@@ -21,6 +21,7 @@ export default connect(
2121
modalProvider,
2222
}),
2323
{
24+
showModal,
2425
hideModal,
2526
removeModal,
2627
},

src/stackableModalProvider.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { connect } from 'react-redux';
22

3-
import { hideModal, removeModal } from './action';
3+
import { showModal, hideModal, removeModal } from './action';
44
import BaseModalProviderComponent from './baseModalProvider';
55

66
class StackableModalProvider extends BaseModalProviderComponent {
@@ -11,6 +11,7 @@ export default connect(
1111
modalProvider,
1212
}),
1313
{
14+
showModal,
1415
hideModal,
1516
removeModal,
1617
},

0 commit comments

Comments
 (0)