Skip to content
This repository was archived by the owner on Oct 19, 2021. It is now read-only.

Commit 74e580e

Browse files
dakahntw15egan
authored andcommitted
fix(modal): set initial focus and conditionally render focus trap (#2163)
* fix(Modal): get focus behavior in sync with/without focus-trap * fix(modal): remove unused focus-trap, createFocusTrap * chore(modal): update snapshots
1 parent e1e2683 commit 74e580e

File tree

2 files changed

+43
-24
lines changed

2 files changed

+43
-24
lines changed

src/components/Modal/Modal.js

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -225,24 +225,30 @@ export default class Modal extends Component {
225225
}
226226
}
227227

228-
focusButton = focusContainerElement => {
228+
initialFocus = focusContainerElement => {
229229
const primaryFocusElement = focusContainerElement
230230
? focusContainerElement.querySelector(this.props.selectorPrimaryFocus)
231231
: null;
232232
if (primaryFocusElement) {
233-
primaryFocusElement.focus();
234-
return;
233+
return primaryFocusElement;
235234
}
236-
if (this.button && this.button.current) {
237-
this.button.current.focus();
235+
return this.button && this.button.current;
236+
};
237+
238+
focusButton = focusContainerElement => {
239+
const target = this.initialFocus(focusContainerElement);
240+
if (target) {
241+
target.focus();
238242
}
239243
};
240244

241245
componentDidMount() {
242246
if (!this.props.open) {
243247
return;
244248
}
245-
this.focusButton(this.innerModal.current);
249+
if (!this.props.focusTrap) {
250+
this.focusButton(this.innerModal.current);
251+
}
246252
}
247253

248254
handleTransitionEnd = evt => {
@@ -253,7 +259,9 @@ export default class Modal extends Component {
253259
this.outerModal.current.offsetHeight &&
254260
this.beingOpen
255261
) {
256-
this.focusButton(evt.currentTarget);
262+
if (!this.props.focusTrap) {
263+
this.focusButton(evt.currentTarget);
264+
}
257265
this.beingOpen = false;
258266
}
259267
};
@@ -349,22 +357,29 @@ export default class Modal extends Component {
349357
</div>
350358
);
351359

352-
return (
353-
<FocusTrap active={open && focusTrap}>
354-
<div
355-
{...other}
356-
onKeyDown={this.handleKeyDown}
357-
onClick={this.handleClick}
358-
onBlur={this.handleBlur}
359-
className={modalClasses}
360-
role="presentation"
361-
tabIndex={-1}
362-
onTransitionEnd={
363-
this.props.open ? this.handleTransitionEnd : undefined
364-
}
365-
ref={this.outerModal}>
366-
{modalBody}
367-
</div>
360+
const modal = (
361+
<div
362+
{...other}
363+
onKeyDown={this.handleKeyDown}
364+
onClick={this.handleClick}
365+
onBlur={this.handleBlur}
366+
className={modalClasses}
367+
role="presentation"
368+
tabIndex={-1}
369+
onTransitionEnd={this.props.open ? this.handleTransitionEnd : undefined}
370+
ref={this.outerModal}>
371+
{modalBody}
372+
</div>
373+
);
374+
375+
return !focusTrap ? (
376+
modal
377+
) : (
378+
// `<FocusTrap>` has `active: true` in its `defaultProps`
379+
<FocusTrap
380+
active={!!open}
381+
focusTrapOptions={{ initialFocus: this.initialFocus }}>
382+
{modal}
368383
</FocusTrap>
369384
);
370385
}

src/components/ModalWrapper/__snapshots__/ModalWrapper-test.js.snap

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,11 @@ exports[`ModalWrapper should render 1`] = `
6060
<FocusTrap
6161
_createFocusTrap={[Function]}
6262
active={false}
63-
focusTrapOptions={Object {}}
63+
focusTrapOptions={
64+
Object {
65+
"initialFocus": [Function],
66+
}
67+
}
6468
paused={false}
6569
>
6670
<div

0 commit comments

Comments
 (0)