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', () => {