Skip to content

Update react-modal to work with React v0.14 and fix deprectated warnings. #68

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ Inside an app:

```js
var React = require('react');
var ReactDOM = require('react-dom');
var Modal = require('react-modal');

var appElement = document.getElementById('your-app-element');
Expand Down Expand Up @@ -64,7 +65,7 @@ var App = React.createClass({
}
});

React.render(<App/>, appElement);
ReactDOM.render(<App/>, appElement);
```

# Demos
Expand Down
3 changes: 2 additions & 1 deletion examples/basic/app.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
var React = require('react');
var ReactDOM = require('react-dom');
var Modal = require('../../lib/index');

var appElement = document.getElementById('example');
Expand Down Expand Up @@ -60,4 +61,4 @@ var App = React.createClass({
}
});

React.render(<App/>, appElement);
ReactDOM.render(<App/>, appElement);
3 changes: 2 additions & 1 deletion examples/bootstrap/app.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
var React = require('react');
var ReactDOM = require('react-dom');
var Modal = require('../../lib/index');

var appElement = document.getElementById('example');
Expand Down Expand Up @@ -65,4 +66,4 @@ var App = React.createClass({
}
});

React.render(<App/>, appElement);
ReactDOM.render(<App/>, appElement);
10 changes: 4 additions & 6 deletions lib/components/Modal.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
var React = require('react');
var ExecutionEnvironment = require('react/lib/ExecutionEnvironment');
var ReactDOM = require('react-dom');
var ExecutionEnvironment = require('exenv');
var ModalPortal = React.createFactory(require('./ModalPortal'));
var ariaAppHider = require('../helpers/ariaAppHider');
var injectCSS = require('../helpers/injectCSS');
Expand Down Expand Up @@ -44,7 +45,7 @@ var Modal = module.exports = React.createClass({
},

componentWillUnmount: function() {
React.unmountComponentAtNode(this.node);
ReactDOM.unmountComponentAtNode(this.node);
document.body.removeChild(this.node);
},

Expand All @@ -59,10 +60,7 @@ var Modal = module.exports = React.createClass({
ariaAppHider.toggle(props.isOpen, props.appElement);
}
sanitizeProps(props);
if (this.portal)
this.portal.setProps(props);
else
this.portal = React.render(ModalPortal(props), this.node);
this.portal = ReactDOM.render(ModalPortal(props), this.node);
},

render: function () {
Expand Down
6 changes: 3 additions & 3 deletions lib/components/ModalPortal.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ var ModalPortal = module.exports = React.createClass({
},

open: function() {
focusManager.setupScopedFocus(this.getDOMNode());
focusManager.setupScopedFocus(this.node);
focusManager.markForFocusLater();
this.setState({isOpen: true}, function() {
this.setState({afterOpen: true});
Expand All @@ -86,7 +86,7 @@ var ModalPortal = module.exports = React.createClass({
},

focusContent: function() {
this.refs.content.getDOMNode().focus();
this.refs.content.focus();
},

closeWithTimeout: function() {
Expand All @@ -108,7 +108,7 @@ var ModalPortal = module.exports = React.createClass({
},

handleKeyDown: function(event) {
if (event.keyCode == 9 /*tab*/) scopeTab(this.refs.content.getDOMNode(), event);
if (event.keyCode == 9 /*tab*/) scopeTab(this.refs.content, event);
if (event.keyCode == 27 /*esc*/) this.requestClose();
},

Expand Down
9 changes: 6 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,10 @@
"karma-firefox-launcher": "0.1.6",
"karma-mocha": "0.2.0",
"mocha": "2.2.5",
"react": ">=0.13.3",
"exenv": "1.2.0",
"react-addons-test-utils": ">=0.14.0-rc1",
"react-dom": ">=0.14.0-rc1",
"react": ">=0.14.0-rc1",
"reactify": "^1.1.1",
"rf-release": "0.4.0",
"uglify-js": "2.4.23",
Expand All @@ -44,7 +47,7 @@
"element-class": "^0.2.0"
},
"peerDependencies": {
"react": ">=0.13.3"
"react": ">=0.14.0.rc1"
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rogeliog Thanks for your great work. I'm currently using your fork now but getting an error on npm install because of this. I guess it should be -rc1 instead of .rc1.

},
"tags": [
"react",
Expand All @@ -60,4 +63,4 @@
"browserify-shim": {
"react": "global:React"
}
}
}
50 changes: 26 additions & 24 deletions specs/Modal.spec.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
require('./helper');
var React = require('react/addons');
var TestUtils = require('react-addons-test-utils');
var React = require('react');
var ReactDOM = require('react-dom');
var Modal = require('../lib/components/Modal');
var Simulate = React.addons.TestUtils.Simulate;
var Simulate = TestUtils.Simulate;
var ariaAppHider = require('../lib/helpers/ariaAppHider');
var button = React.DOM.button;
var button = ReactDOM.button;

describe('Modal', function () {

Expand All @@ -13,43 +15,43 @@ describe('Modal', function () {

it('can be open initially', function() {
var component = renderModal({isOpen: true}, 'hello');
equal(component.portal.refs.content.getDOMNode().innerHTML.trim(), 'hello');
equal(component.portal.refs.content.innerHTML.trim(), 'hello');
unmountModal();
});

it('can be closed initially', function() {
var component = renderModal({}, 'hello');
equal(component.portal.getDOMNode().innerHTML.trim(), '');
equal(ReactDOM.findDOMNode(component.portal).innerHTML.trim(), '');
unmountModal();
});

it('throws without an appElement', function() {
var node = document.createElement('div');
throws(function() {
React.render(React.createElement(Modal, {isOpen: true}), node);
ReactDOM.render(React.createElement(Modal, {isOpen: true}), node);
});
React.unmountComponentAtNode(node);
ReactDOM.unmountComponentAtNode(node);
});

it('uses the global appElement', function() {
var app = document.createElement('div');
var node = document.createElement('div');
Modal.setAppElement(app);
React.render(React.createElement(Modal, {isOpen: true}), node);
ReactDOM.render(React.createElement(Modal, {isOpen: true}), node);
equal(app.getAttribute('aria-hidden'), 'true');
ariaAppHider.resetForTesting();
React.unmountComponentAtNode(node);
ReactDOM.unmountComponentAtNode(node);
});

it('accepts appElement as a prop', function() {
var el = document.createElement('div');
var node = document.createElement('div');
React.render(React.createElement(Modal, {
ReactDOM.render(React.createElement(Modal, {
isOpen: true,
appElement: el
}), node);
equal(el.getAttribute('aria-hidden'), 'true');
React.unmountComponentAtNode(node);
ReactDOM.unmountComponentAtNode(node);
});

it('renders into the body, not in context', function() {
Expand All @@ -59,67 +61,67 @@ describe('Modal', function () {
return React.DOM.div({}, React.createElement(Modal, {isOpen: true, ariaHideApp: false}, 'hello'));
}
});
React.render(React.createElement(App), node);
ReactDOM.render(React.createElement(App), node);
var modalParent = document.body.querySelector('.ReactModalPortal').parentNode;
equal(modalParent, document.body);
React.unmountComponentAtNode(node);
ReactDOM.unmountComponentAtNode(node);
});

it('renders children', function() {
var child = 'I am a child of Modal, and he has sent me here...';
var component = renderModal({isOpen: true}, child);
equal(component.portal.refs.content.getDOMNode().innerHTML, child);
equal(component.portal.refs.content.innerHTML, child);
unmountModal();
});

it('has default props', function() {
var node = document.createElement('div');
Modal.setAppElement(document.createElement('div'));
var component = React.render(React.createElement(Modal), node);
var component = ReactDOM.render(React.createElement(Modal), node);
var props = component.props;
equal(props.isOpen, false);
equal(props.ariaHideApp, true);
equal(props.closeTimeoutMS, 0);
React.unmountComponentAtNode(node);
ReactDOM.unmountComponentAtNode(node);
ariaAppHider.resetForTesting();
});

it('removes the portal node', function() {
var component = renderModal({isOpen: true}, 'hello');
equal(component.portal.refs.content.getDOMNode().innerHTML.trim(), 'hello');
equal(component.portal.refs.content.innerHTML.trim(), 'hello');
unmountModal();
ok(!document.querySelector('.ReactModalPortal'));
});

it('focuses the modal content', function() {
renderModal({isOpen: true}, null, function () {
strictEqual(document.activeElement, this.portal.refs.content.getDOMNode());
strictEqual(document.activeElement, this.portal.refs.content);
unmountModal();
});
});

it('supports custom className', function() {
var modal = renderModal({isOpen: true, className: 'myClass'});
equal(modal.portal.refs.content.getDOMNode().className.contains('myClass'), true);
equal(modal.portal.refs.content.className.contains('myClass'), true);
unmountModal();
});

it('supports overlayClassName', function () {
var modal = renderModal({isOpen: true, overlayClassName: 'myOverlayClass'});
equal(modal.portal.refs.overlay.getDOMNode().className.contains('myOverlayClass'), true);
equal(modal.portal.refs.overlay.className.contains('myOverlayClass'), true);
unmountModal();
});

it('supports adding style to the modal contents', function () {
var modal = renderModal({isOpen: true, style: {width: '20px'}});
equal(modal.portal.refs.content.getDOMNode().style.width, '20px');
equal(modal.portal.refs.content.style.width, '20px');
});

it('adds class to body when open', function() {
var modal = renderModal({isOpen: false});
equal(document.body.className.contains('ReactModal__Body--open'), false);

modal.setProps({ isOpen: true});
modal = renderModal({isOpen: true});
equal(document.body.className.contains('ReactModal__Body--open'), true);

modal = renderModal({isOpen: false});
Expand All @@ -139,13 +141,13 @@ describe('Modal', function () {
//it('adds --before-close for animations', function() {
//var node = document.createElement('div');

//var component = React.render(React.createElement(Modal, {
//var component = ReactDOM.render(React.createElement(Modal, {
//isOpen: true,
//ariaHideApp: false,
//closeTimeoutMS: 50,
//}), node);

//component = React.render(React.createElement(Modal, {
//component = ReactDOM.render(React.createElement(Modal, {
//isOpen: false,
//ariaHideApp: false,
//closeTimeoutMS: 50,
Expand Down
8 changes: 4 additions & 4 deletions specs/helper.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
assert = require('assert');
React = require('react/addons');
var React = require('react');
var ReactDOM = require('react-dom');
var Modal = React.createFactory(require('../lib/components/Modal'));

ReactTestUtils = React.addons.TestUtils;
ok = assert.ok;
equal = assert.equal;
strictEqual = assert.strictEqual;
Expand All @@ -14,11 +14,11 @@ renderModal = function(props, children, callback) {
props.ariaHideApp = false;
_currentDiv = document.createElement('div');
document.body.appendChild(_currentDiv);
return React.render(Modal(props, children), _currentDiv, callback);
return ReactDOM.render(Modal(props, children), _currentDiv, callback);
};

unmountModal = function() {
React.unmountComponentAtNode(_currentDiv);
ReactDOM.unmountComponentAtNode(_currentDiv);
document.body.removeChild(_currentDiv);
_currentDiv = null;
};