jobiqo-cl
Version:
[](https://circleci.com/gh/jobiqo/jobiqo-cl)
194 lines (172 loc) • 6.66 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var React = require('react');
var React__default = _interopDefault(React);
var _extends = require('../../../@babel/runtime/helpers/esm/extends.js');
var index = require('../../../prop-types/index.js');
var constants = require('../../../focus-lock/dist/es2015/constants.js');
require('../../../use-callback-ref/dist/es2015/assignRef.js');
require('../../../use-callback-ref/dist/es2015/useRef.js');
var useMergeRef = require('../../../use-callback-ref/dist/es2015/useMergeRef.js');
var FocusGuard = require('./FocusGuard.js');
var medium = require('./medium.js');
var emptyArray = [];
var FocusLock = React__default.forwardRef(function (props, parentRef) {
var _extends2;
var _useState = React.useState(),
realObserved = _useState[0],
setObserved = _useState[1];
var observed = React.useRef();
var isActive = React.useRef(false);
var originalFocusedElement = React.useRef(null);
var children = props.children,
disabled = props.disabled,
noFocusGuards = props.noFocusGuards,
persistentFocus = props.persistentFocus,
autoFocus = props.autoFocus,
allowTextSelection = props.allowTextSelection,
group = props.group,
className = props.className,
whiteList = props.whiteList,
_props$shards = props.shards,
shards = _props$shards === void 0 ? emptyArray : _props$shards,
_props$as = props.as,
Container = _props$as === void 0 ? 'div' : _props$as,
_props$lockProps = props.lockProps,
containerProps = _props$lockProps === void 0 ? {} : _props$lockProps,
SideCar = props.sideCar,
shouldReturnFocus = props.returnFocus,
onActivationCallback = props.onActivation,
onDeactivationCallback = props.onDeactivation;
var _useState2 = React.useState({}),
id = _useState2[0]; // SIDE EFFECT CALLBACKS
var onActivation = React.useCallback(function () {
originalFocusedElement.current = originalFocusedElement.current || document && document.activeElement;
if (observed.current && onActivationCallback) {
onActivationCallback(observed.current);
}
isActive.current = true;
}, [onActivationCallback]);
var onDeactivation = React.useCallback(function () {
isActive.current = false;
if (onDeactivationCallback) {
onDeactivationCallback(observed.current);
}
}, [onDeactivationCallback]);
var returnFocus = React.useCallback(function (allowDefer) {
var current = originalFocusedElement.current;
if (Boolean(shouldReturnFocus) && current && current.focus) {
var focusOptions = typeof shouldReturnFocus === 'object' ? shouldReturnFocus : undefined;
originalFocusedElement.current = null;
if (allowDefer) {
// React might return focus after update
// it's safer to defer the action
Promise.resolve().then(function () {
return current.focus(focusOptions);
});
} else {
current.focus(focusOptions);
}
}
}, [shouldReturnFocus]); // MEDIUM CALLBACKS
var onFocus = React.useCallback(function (event) {
if (isActive.current) {
medium.mediumFocus.useMedium(event);
}
}, []);
var onBlur = medium.mediumBlur.useMedium; // REF PROPAGATION
// not using real refs due to race conditions
var setObserveNode = React.useCallback(function (newObserved) {
if (observed.current !== newObserved) {
observed.current = newObserved;
setObserved(newObserved);
}
}, []);
if (process.env.NODE_ENV !== 'production') {
if (typeof allowTextSelection !== 'undefined') {
// eslint-disable-next-line no-console
console.warn('React-Focus-Lock: allowTextSelection is deprecated and enabled by default');
}
React__default.useEffect(function () {
if (!observed.current) {
// eslint-disable-next-line no-console
console.error('FocusLock: could not obtain ref to internal node');
}
}, []);
}
var lockProps = _extends.default((_extends2 = {}, _extends2[constants.FOCUS_DISABLED] = disabled && 'disabled', _extends2[constants.FOCUS_GROUP] = group, _extends2), containerProps);
var hasLeadingGuards = noFocusGuards !== true;
var hasTailingGuards = hasLeadingGuards && noFocusGuards !== 'tail';
var mergedRef = useMergeRef.useMergeRefs([parentRef, setObserveNode]);
return React__default.createElement(React__default.Fragment, null, hasLeadingGuards && [React__default.createElement("div", {
key: "guard-first",
"data-focus-guard": true,
tabIndex: disabled ? -1 : 0,
style: FocusGuard.hiddenGuard
}), // nearest focus guard
React__default.createElement("div", {
key: "guard-nearest",
"data-focus-guard": true,
tabIndex: disabled ? -1 : 1,
style: FocusGuard.hiddenGuard
})], !disabled && React__default.createElement(SideCar, {
id: id,
sideCar: medium.mediumSidecar,
observed: realObserved,
disabled: disabled,
persistentFocus: persistentFocus,
autoFocus: autoFocus,
whiteList: whiteList,
shards: shards,
onActivation: onActivation,
onDeactivation: onDeactivation,
returnFocus: returnFocus
}), React__default.createElement(Container, _extends.default({
ref: mergedRef
}, lockProps, {
className: className,
onBlur: onBlur,
onFocus: onFocus
}), children), hasTailingGuards && React__default.createElement("div", {
"data-focus-guard": true,
tabIndex: disabled ? -1 : 0,
style: FocusGuard.hiddenGuard
}));
});
FocusLock.propTypes = process.env.NODE_ENV !== "production" ? {
children: index.node,
disabled: index.bool,
returnFocus: index.oneOfType([index.bool, index.object]),
noFocusGuards: index.bool,
allowTextSelection: index.bool,
autoFocus: index.bool,
persistentFocus: index.bool,
group: index.string,
className: index.string,
whiteList: index.func,
shards: index.arrayOf(index.any),
as: index.oneOfType([index.string, index.func, index.object]),
lockProps: index.object,
onActivation: index.func,
onDeactivation: index.func,
sideCar: index.any.isRequired
} : {};
FocusLock.defaultProps = {
children: undefined,
disabled: false,
returnFocus: false,
noFocusGuards: false,
autoFocus: true,
persistentFocus: false,
allowTextSelection: undefined,
group: undefined,
className: undefined,
whiteList: undefined,
shards: undefined,
as: 'div',
lockProps: {},
onActivation: undefined,
onDeactivation: undefined
};
exports.default = FocusLock;