Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

71 строка
2.4 KiB

  1. "use strict";
  2. exports.__esModule = true;
  3. exports.default = useFocusManager;
  4. var _react = require("react");
  5. var _useEventCallback = _interopRequireDefault(require("./useEventCallback"));
  6. var _useMounted = _interopRequireDefault(require("./useMounted"));
  7. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  8. /**
  9. * useFocusManager provides a way to track and manage focus as it moves around
  10. * a container element. An `onChange` is fired when focus enters or leaves the
  11. * element, but not when it moves around inside the element, similar to
  12. * `pointerenter` and `pointerleave` DOM events.
  13. *
  14. * ```tsx
  15. * const [focused, setFocusState] = useState(false)
  16. *
  17. * const { onBlur, onFocus } = useFocusManager({
  18. * onChange: nextFocused => setFocusState(nextFocused)
  19. * })
  20. *
  21. * return (
  22. * <div tabIndex="-1" onFocus={onFocus} onBlur={onBlur}>
  23. * {String(focused)}
  24. * <input />
  25. * <input />
  26. *
  27. * <button>A button</button>
  28. * </div>
  29. * ```
  30. *
  31. */
  32. function useFocusManager(opts) {
  33. var isMounted = (0, _useMounted.default)();
  34. var lastFocused = (0, _react.useRef)();
  35. var handle = (0, _react.useRef)();
  36. var willHandle = (0, _useEventCallback.default)(opts.willHandle);
  37. var didHandle = (0, _useEventCallback.default)(opts.didHandle);
  38. var onChange = (0, _useEventCallback.default)(opts.onChange);
  39. var isDisabled = (0, _useEventCallback.default)(opts.isDisabled);
  40. var handleFocusChange = (0, _react.useCallback)(function (focused, event) {
  41. if (event && event.persist) event.persist();
  42. if (willHandle && willHandle(focused, event) === false) return;
  43. clearTimeout(handle.current);
  44. handle.current = setTimeout(function () {
  45. if (focused !== lastFocused.current) {
  46. if (didHandle) didHandle(focused, event); // only fire a change when unmounted if its a blur
  47. if (isMounted() || !focused) {
  48. lastFocused.current = focused;
  49. onChange && onChange(focused, event);
  50. }
  51. }
  52. });
  53. }, [isMounted, willHandle, didHandle, onChange, lastFocused]);
  54. var handleBlur = (0, _react.useCallback)(function (event) {
  55. if (!isDisabled()) handleFocusChange(false, event);
  56. }, [handleFocusChange, isDisabled]);
  57. var handleFocus = (0, _react.useCallback)(function (event) {
  58. if (!isDisabled()) handleFocusChange(true, event);
  59. }, [handleFocusChange, isDisabled]);
  60. return {
  61. onBlur: handleBlur,
  62. onFocus: handleFocus
  63. };
  64. }