From d1ce5160f6054677810e1e41f07d3a56a1dc2065 Mon Sep 17 00:00:00 2001 From: Curtis Date: Thu, 28 Jun 2018 11:57:38 -0700 Subject: [PATCH] [Snackbar] Add check for autoHideDuration if equals 0 (#12002) * Add check for snackbar autoHideDuration if equals 0 * Add unit test for resumeHideDuration equaling zero * fix anothre potential issue --- packages/material-ui/src/Snackbar/Snackbar.js | 17 +++++++++----- .../material-ui/src/Snackbar/Snackbar.test.js | 23 +++++++++++++++++++ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/packages/material-ui/src/Snackbar/Snackbar.js b/packages/material-ui/src/Snackbar/Snackbar.js index 09c689489226c0..89aeef5aba3775 100644 --- a/packages/material-ui/src/Snackbar/Snackbar.js +++ b/packages/material-ui/src/Snackbar/Snackbar.js @@ -133,19 +133,24 @@ class Snackbar extends React.Component { } // Timer that controls delay before snackbar auto hides - setAutoHideTimer(autoHideDuration = null) { - if (!this.props.onClose || this.props.autoHideDuration == null) { + setAutoHideTimer(autoHideDuration) { + const autoHideDurationBefore = + autoHideDuration != null ? autoHideDuration : this.props.autoHideDuration; + + if (!this.props.onClose || autoHideDurationBefore == null) { return; } clearTimeout(this.timerAutoHide); this.timerAutoHide = setTimeout(() => { - if (!this.props.onClose || this.props.autoHideDuration == null) { + const autoHideDurationAfter = + autoHideDuration != null ? autoHideDuration : this.props.autoHideDuration; + if (!this.props.onClose || autoHideDurationAfter == null) { return; } this.props.onClose(null, 'timeout'); - }, autoHideDuration || this.props.autoHideDuration || 0); + }, autoHideDurationBefore); } handleMouseEnter = event => { @@ -178,11 +183,11 @@ class Snackbar extends React.Component { // or when the window is shown back. handleResume = () => { if (this.props.autoHideDuration != null) { - if (this.props.resumeHideDuration !== undefined) { + if (this.props.resumeHideDuration != null) { this.setAutoHideTimer(this.props.resumeHideDuration); return; } - this.setAutoHideTimer((this.props.autoHideDuration || 0) * 0.5); + this.setAutoHideTimer(this.props.autoHideDuration * 0.5); } }; diff --git a/packages/material-ui/src/Snackbar/Snackbar.test.js b/packages/material-ui/src/Snackbar/Snackbar.test.js index 272766f74cf0bd..4ad95b8ca47d93 100644 --- a/packages/material-ui/src/Snackbar/Snackbar.test.js +++ b/packages/material-ui/src/Snackbar/Snackbar.test.js @@ -275,6 +275,29 @@ describe('', () => { assert.strictEqual(handleClose.callCount, 1); assert.deepEqual(handleClose.args[0], [null, 'timeout']); }); + + it('should call onClose immediately after user interaction when 0', () => { + const handleClose = spy(); + const autoHideDuration = 6e3; + const resumeHideDuration = 0; + const wrapper = mount( + , + ); + wrapper.setProps({ open: true }); + assert.strictEqual(handleClose.callCount, 0); + wrapper.simulate('mouseEnter'); + clock.tick(100); + wrapper.simulate('mouseLeave'); + clock.tick(resumeHideDuration); + assert.strictEqual(handleClose.callCount, 1); + assert.deepEqual(handleClose.args[0], [null, 'timeout']); + }); }); describe('prop: disableWindowBlurListener', () => {