Skip to content
This repository was archived by the owner on Jan 13, 2025. It is now read-only.

Commit e161cc0

Browse files
piotr-czwilliamernest
authored andcommitted
fix(snackbar): Doesn't close while other element is focused (#2183)
BREAKING CHANGE: Adds a new adapter method that is required `isFocused`.
1 parent 0d02f1f commit e161cc0

File tree

5 files changed

+21
-3
lines changed

5 files changed

+21
-3
lines changed

packages/mdc-snackbar/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ The adapter for snackbars must provide the following functions, with correct sig
206206
| `setActionText(actionText: string) => void` | Set the text content of the action element. |
207207
| `setMessageText(message: string) => void` | Set the text content of the message element. |
208208
| `setFocus() => void` | Sets focus on the action button. |
209+
| `isFocused() => boolean` | Detects focus on the action button. |
209210
| `visibilityIsHidden() => boolean` | Returns document.hidden property. |
210211
| `registerBlurHandler(handler: EventListener) => void` | Registers an event handler to be called when a `blur` event is triggered on the action button |
211212
| `deregisterBlurHandler(handler: EventListener) => void` | Deregisters a `blur` event handler from the actionButton |

packages/mdc-snackbar/foundation.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export default class MDCSnackbarFoundation extends MDCFoundation {
3737
setActionText: (/* actionText: string */) => {},
3838
setMessageText: (/* message: string */) => {},
3939
setFocus: () => {},
40+
isFocused: () => /* boolean */ false,
4041
visibilityIsHidden: () => /* boolean */ false,
4142
registerCapturedBlurHandler: (/* handler: EventListener */) => {},
4243
deregisterCapturedBlurHandler: (/* handler: EventListener */) => {},
@@ -81,12 +82,15 @@ export default class MDCSnackbarFoundation extends MDCFoundation {
8182
}
8283
};
8384
this.interactionHandler_ = (evt) => {
84-
if (evt.type == 'touchstart' || evt.type == 'mousedown') {
85+
if (evt.type === 'focus' && !this.adapter_.isFocused()) {
86+
return;
87+
}
88+
if (evt.type === 'touchstart' || evt.type === 'mousedown') {
8589
this.pointerDownRecognized_ = true;
8690
}
8791
this.handlePossibleTabKeyboardFocus_(evt);
8892

89-
if (evt.type == 'focus') {
93+
if (evt.type === 'focus') {
9094
this.pointerDownRecognized_ = false;
9195
}
9296
};

packages/mdc-snackbar/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export class MDCSnackbar extends MDCComponent {
4848
setActionText: (text) => {getActionButton().textContent = text;},
4949
setMessageText: (text) => {getText().textContent = text;},
5050
setFocus: () => getActionButton().focus(),
51+
isFocused: () => document.activeElement === getActionButton(),
5152
visibilityIsHidden: () => document.hidden,
5253
registerCapturedBlurHandler: (handler) => getActionButton().addEventListener('blur', handler, true),
5354
deregisterCapturedBlurHandler: (handler) => getActionButton().removeEventListener('blur', handler, true),

test/unit/mdc-snackbar/foundation.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ test('defaultAdapter returns a complete adapter implementation', () => {
4444
assert.equal(methods.length, Object.keys(defaultAdapter).length, 'Every adapter key must be a function');
4545
assert.deepEqual(methods, [
4646
'addClass', 'removeClass', 'setAriaHidden', 'unsetAriaHidden', 'setActionAriaHidden',
47-
'unsetActionAriaHidden', 'setActionText', 'setMessageText', 'setFocus', 'visibilityIsHidden',
47+
'unsetActionAriaHidden', 'setActionText', 'setMessageText', 'setFocus', 'isFocused', 'visibilityIsHidden',
4848
'registerCapturedBlurHandler', 'deregisterCapturedBlurHandler', 'registerVisibilityChangeHandler',
4949
'deregisterVisibilityChangeHandler', 'registerCapturedInteractionHandler',
5050
'deregisterCapturedInteractionHandler', 'registerActionClickHandler',

test/unit/mdc-snackbar/mdc-snackbar.test.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,18 @@ test('adapter#setFocus sets focus on the action button', () => {
146146
document.body.removeChild(root);
147147
});
148148

149+
test('adapter#isFocused detects focus on the action button', () => {
150+
const {root, component} = setupTest();
151+
const handler = td.func('fixture focus handler');
152+
root.addEventListener('focus', handler);
153+
document.body.appendChild(root);
154+
155+
component.getDefaultFoundation().adapter_.setFocus();
156+
157+
assert.isOk(component.getDefaultFoundation().adapter_.isFocused());
158+
document.body.removeChild(root);
159+
});
160+
149161
test('adapter#visibilityIsHidden returns the document.hidden property', () => {
150162
const {component} = setupTest();
151163
assert.equal(component.getDefaultFoundation().adapter_.visibilityIsHidden(), document.hidden);

0 commit comments

Comments
 (0)