Skip to content

Commit 2e92ab8

Browse files
author
Andrew Fuller
committed
Do not update closed modal if next props are also closed
1 parent ebec638 commit 2e92ab8

File tree

2 files changed

+43
-10
lines changed

2 files changed

+43
-10
lines changed

lib/components/Modal.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,13 @@ export default class Modal extends Component {
8888
this.renderPortal(this.props);
8989
}
9090

91-
componentWillReceiveProps (newProps) {
91+
shouldComponentUpdate (newProps) {
92+
// Do not update if Modal will remain closed
93+
if (!this.props.isOpen && !newProps.isOpen) return false;
94+
return true;
95+
}
96+
97+
componentWillUpdate (newProps) {
9298
const currentParent = getParentElement(this.props.parentSelector);
9399
const newParent = getParentElement(newProps.parentSelector);
94100

specs/Modal.spec.js

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -112,17 +112,21 @@ describe('Modal', () => {
112112
});
113113

114114
it('give back focus to previous element or modal.', (done) => {
115+
function cleanup () {
116+
unmountModal();
117+
done();
118+
}
115119
const modal = renderModal({
116120
isOpen: true,
117121
onRequestClose () {
118-
unmountModal();
119-
done();
122+
cleanup();
120123
}
121124
}, null, () => {});
122125

123126
renderModal({
124127
isOpen: true,
125128
onRequestClose () {
129+
unmountModal();
126130
Simulate.keyDown(modal.portal.content, {
127131
// The keyCode is all that matters, so this works
128132
key: 'FakeKeyToTestLater',
@@ -175,6 +179,7 @@ describe('Modal', () => {
175179
preventDefault () { tabPrevented = true; }
176180
});
177181
expect(tabPrevented).toEqual(true);
182+
unmountModal();
178183
});
179184

180185
it('supports portalClassName', () => {
@@ -204,26 +209,31 @@ describe('Modal', () => {
204209
it('overrides the default styles when a custom overlayClassName is used', () => {
205210
const modal = renderModal({ isOpen: true, overlayClassName: 'myOverlayClass' });
206211
expect(modal.portal.overlay.style.backgroundColor).toEqual('');
212+
unmountModal();
207213
});
208214

209215
it('supports adding style to the modal contents', () => {
210216
const modal = renderModal({ isOpen: true, style: { content: { width: '20px' } } });
211217
expect(modal.portal.content.style.width).toEqual('20px');
218+
unmountModal();
212219
});
213220

214221
it('supports overriding style on the modal contents', () => {
215222
const modal = renderModal({ isOpen: true, style: { content: { position: 'static' } } });
216223
expect(modal.portal.content.style.position).toEqual('static');
224+
unmountModal();
217225
});
218226

219227
it('supports adding style on the modal overlay', () => {
220228
const modal = renderModal({ isOpen: true, style: { overlay: { width: '75px' } } });
221229
expect(modal.portal.overlay.style.width).toEqual('75px');
230+
unmountModal();
222231
});
223232

224233
it('supports overriding style on the modal overlay', () => {
225234
const modal = renderModal({ isOpen: true, style: { overlay: { position: 'static' } } });
226235
expect(modal.portal.overlay.style.position).toEqual('static');
236+
unmountModal();
227237
});
228238

229239
it('supports overriding the default styles', () => {
@@ -234,25 +244,42 @@ describe('Modal', () => {
234244
const modal = renderModal({ isOpen: true });
235245
expect(modal.portal.content.style.position).toEqual(newStyle);
236246
Modal.defaultStyles.content.position = previousStyle;
247+
unmountModal();
248+
});
249+
250+
it('should remove class from body when no modals opened', () => {
251+
const expectedBodyClass = 'ReactModal__Body--open';
252+
const classList = document.body.classList;
253+
renderModal({ isOpen: true });
254+
renderModal({ isOpen: true });
255+
expect(classList.contains(expectedBodyClass)).toBe(true);
256+
unmountModal();
257+
expect(classList.contains(expectedBodyClass)).toBe(false);
258+
unmountModal();
259+
expect(classList.contains(expectedBodyClass)).toBe(false);
237260
});
238261

239262
it('adds class to body when open', () => {
263+
const expectedBodyClass = 'ReactModal__Body--open';
264+
const classList = document.body.classList;
240265
renderModal({ isOpen: false });
241-
expect(document.body.className.indexOf('ReactModal__Body--open') !== -1).toEqual(false);
242-
266+
expect(classList.contains(expectedBodyClass)).toEqual(false);
267+
unmountModal();
243268
renderModal({ isOpen: true });
244-
expect(document.body.className.indexOf('ReactModal__Body--open') !== -1).toEqual(true);
245-
269+
expect(classList.contains(expectedBodyClass)).toEqual(true);
270+
unmountModal();
246271
renderModal({ isOpen: false });
247-
expect(document.body.className.indexOf('ReactModal__Body--open') !== -1).toEqual(false);
272+
expect(classList.contains(expectedBodyClass)).toEqual(false);
248273
unmountModal();
249274
});
250275

251276
it('removes class from body when unmounted without closing', () => {
277+
const expectedBodyClass = 'ReactModal__Body--open';
278+
const classList = document.body.classList;
252279
renderModal({ isOpen: true });
253-
expect(document.body.className.indexOf('ReactModal__Body--open') !== -1).toEqual(true);
280+
expect(classList.contains(expectedBodyClass)).toEqual(true);
254281
unmountModal();
255-
expect(document.body.className.indexOf('ReactModal__Body--open') !== -1).toEqual(false);
282+
expect(classList.contains(expectedBodyClass)).toEqual(false);
256283
});
257284

258285
it('removes aria-hidden from appElement when unmounted without closing', () => {

0 commit comments

Comments
 (0)