Skip to content

Commit f19e507

Browse files
committed
feat: support focusOptions, fixes #162
1 parent 4ef6569 commit f19e507

File tree

3 files changed

+23
-6
lines changed

3 files changed

+23
-6
lines changed

interfaces.d.ts

+13
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,19 @@ export interface ReactFocusLockProps<ChildrenType = React.ReactNode, LockProps=R
1414
*/
1515
returnFocus?: boolean | FocusOptions | ((returnTo: Element)=> boolean | FocusOptions);
1616

17+
/**
18+
* used to control behavior or "returning focus back to the lock"
19+
*
20+
* @deprecated Can lead to a wrong user experience. Use this option only if you known what you are doing
21+
* @see {@link https://github.com/theKashey/react-focus-lock/issues/162}
22+
* @example
23+
* prevent scroll example
24+
* ```tsx
25+
* <FocusLock focusOptions={{preventScroll: true}} />
26+
* ```
27+
*/
28+
focusOptions?: FocusOptions;
29+
1730
/**
1831
* @deprecated Use persistentFocus=false instead
1932
* enables(or disables) text selection. This also allows not to have ANY focus.

src/Lock.js

+8-4
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ const FocusLock = React.forwardRef(function FocusLockUI(props, parentRef) {
3434
sideCar: SideCar,
3535

3636
returnFocus: shouldReturnFocus,
37+
focusOptions,
3738

3839
onActivation: onActivationCallback,
3940
onDeactivation: onDeactivationCallback,
@@ -73,15 +74,15 @@ const FocusLock = React.forwardRef(function FocusLockUI(props, parentRef) {
7374
if (returnFocusTo && returnFocusTo.focus) {
7475
const howToReturnFocus = typeof shouldReturnFocus === 'function' ? shouldReturnFocus(returnFocusTo) : shouldReturnFocus;
7576
if (Boolean(howToReturnFocus)) {
76-
const focusOptions = typeof howToReturnFocus === 'object' ? howToReturnFocus : undefined;
77+
const returnFocusOptions = typeof howToReturnFocus === 'object' ? howToReturnFocus : undefined;
7778
originalFocusedElement.current = null;
7879

7980
if (allowDefer) {
8081
// React might return focus after update
8182
// it's safer to defer the action
82-
Promise.resolve().then(() => returnFocusTo.focus(focusOptions));
83+
Promise.resolve().then(() => returnFocusTo.focus(returnFocusOptions));
8384
} else {
84-
returnFocusTo.focus(focusOptions);
85+
returnFocusTo.focus(returnFocusOptions);
8586
}
8687
}
8788
}
@@ -152,6 +153,7 @@ const FocusLock = React.forwardRef(function FocusLockUI(props, parentRef) {
152153
onActivation={onActivation}
153154
onDeactivation={onDeactivation}
154155
returnFocus={returnFocus}
156+
focusOptions={focusOptions}
155157
/>
156158
)}
157159
<Container
@@ -174,7 +176,8 @@ const FocusLock = React.forwardRef(function FocusLockUI(props, parentRef) {
174176
FocusLock.propTypes = {
175177
children: node,
176178
disabled: bool,
177-
returnFocus: oneOfType([bool, object]),
179+
returnFocus: oneOfType([bool, object, func]),
180+
focusOptions: object,
178181
noFocusGuards: bool,
179182

180183
allowTextSelection: bool,
@@ -201,6 +204,7 @@ FocusLock.defaultProps = {
201204
children: undefined,
202205
disabled: false,
203206
returnFocus: false,
207+
focusOptions: undefined,
204208
noFocusGuards: false,
205209
autoFocus: true,
206210
persistentFocus: false,

src/Trap.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ const activateTrap = () => {
7171
let result = false;
7272
if (lastActiveTrap) {
7373
const {
74-
observed, persistentFocus, autoFocus, shards, crossFrame,
74+
observed, persistentFocus, autoFocus, shards, crossFrame, focusOptions,
7575
} = lastActiveTrap;
7676
const workingNode = observed || (lastPortaledElement && lastPortaledElement.portaledElement);
7777
const activeElement = document && document.activeElement;
@@ -101,7 +101,7 @@ const activateTrap = () => {
101101
}
102102
document.body.focus();
103103
} else {
104-
result = moveFocusInside(workingArea, lastActiveFocus);
104+
result = moveFocusInside(workingArea, lastActiveFocus, {focusOptions});
105105
lastPortaledElement = {};
106106
}
107107
}

0 commit comments

Comments
 (0)