UNPKG

jobiqo-cl

Version:

[![CircleCI](https://circleci.com/gh/jobiqo/jobiqo-cl.svg?style=svg&circle-token=5a24efa5b8bbc4879276123e77d0d3f35ca7144c)](https://circleci.com/gh/jobiqo/jobiqo-cl)

194 lines (172 loc) 6.66 kB
'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;