-
Notifications
You must be signed in to change notification settings - Fork 69
/
Copy pathMoveFocusInside.js
48 lines (42 loc) · 1.09 KB
/
MoveFocusInside.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import React from 'react';
import PropTypes from 'prop-types';
import * as constants from 'focus-lock/constants';
import { inlineProp } from './util';
import { mediumEffect } from './medium';
function MoveFocusInside({ disabled: isDisabled, className, children }) {
const ref = React.useRef(null);
const disabled = React.useRef(isDisabled);
const moveFocus = () => {
const observed = ref.current;
mediumEffect.useMedium((car) => {
if (!disabled.current && observed) {
if (!car.focusInside(observed)) {
car.moveFocusInside(observed, null);
}
}
});
};
React.useEffect(() => {
disabled.current = isDisabled;
moveFocus();
}, [isDisabled]);
return (
<div
{...inlineProp(constants.FOCUS_AUTO, !isDisabled)}
ref={ref}
className={className}
>
{children}
</div>
);
}
MoveFocusInside.propTypes = {
children: PropTypes.node.isRequired,
disabled: PropTypes.bool,
className: PropTypes.string,
};
MoveFocusInside.defaultProps = {
disabled: false,
className: undefined,
};
export default MoveFocusInside;