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

185 строки
5.7 KiB

  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. exports.__esModule = true;
  4. exports.useDropdownMenu = useDropdownMenu;
  5. exports["default"] = void 0;
  6. var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
  7. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  8. var _propTypes = _interopRequireDefault(require("prop-types"));
  9. var _react = require("react");
  10. var _useCallbackRef2 = _interopRequireDefault(require("@restart/hooks/useCallbackRef"));
  11. var _DropdownContext = _interopRequireDefault(require("./DropdownContext"));
  12. var _usePopper = _interopRequireDefault(require("./usePopper"));
  13. var _useRootClose = _interopRequireDefault(require("./useRootClose"));
  14. function useDropdownMenu(options) {
  15. if (options === void 0) {
  16. options = {};
  17. }
  18. var context = (0, _react.useContext)(_DropdownContext["default"]);
  19. var _useCallbackRef = (0, _useCallbackRef2["default"])(),
  20. arrowElement = _useCallbackRef[0],
  21. attachArrowRef = _useCallbackRef[1];
  22. var hasShownRef = (0, _react.useRef)(false);
  23. var _options = options,
  24. flip = _options.flip,
  25. rootCloseEvent = _options.rootCloseEvent,
  26. _options$popperConfig = _options.popperConfig,
  27. popperConfig = _options$popperConfig === void 0 ? {} : _options$popperConfig,
  28. _options$usePopper = _options.usePopper,
  29. shouldUsePopper = _options$usePopper === void 0 ? true : _options$usePopper;
  30. var show = context.show == null ? options.show : context.show;
  31. var alignEnd = context.alignEnd == null ? options.alignEnd : context.alignEnd;
  32. if (show && !hasShownRef.current) {
  33. hasShownRef.current = true;
  34. }
  35. var handleClose = function handleClose(e) {
  36. if (!context.toggle) return;
  37. context.toggle(false, e);
  38. };
  39. var drop = context.drop,
  40. setMenu = context.setMenu,
  41. menuElement = context.menuElement,
  42. toggleElement = context.toggleElement;
  43. var placement = alignEnd ? 'bottom-end' : 'bottom-start';
  44. if (drop === 'up') placement = alignEnd ? 'top-end' : 'top-start';else if (drop === 'right') placement = alignEnd ? 'right-end' : 'right-start';else if (drop === 'left') placement = alignEnd ? 'left-end' : 'left-start';
  45. var popper = (0, _usePopper["default"])(toggleElement, menuElement, {
  46. placement: placement,
  47. enabled: !!(shouldUsePopper && show),
  48. eventsEnabled: !!show,
  49. modifiers: (0, _extends2["default"])({
  50. flip: {
  51. enabled: !!flip
  52. },
  53. arrow: (0, _extends2["default"])({}, popperConfig.modifiers && popperConfig.modifiers.arrow, {
  54. enabled: !!arrowElement,
  55. element: arrowElement
  56. })
  57. }, popperConfig.modifiers)
  58. });
  59. var menu = null;
  60. var menuProps = {
  61. ref: setMenu,
  62. 'aria-labelledby': toggleElement && toggleElement.id
  63. };
  64. var childArgs = {
  65. show: show,
  66. alignEnd: alignEnd,
  67. hasShown: hasShownRef.current,
  68. close: handleClose
  69. };
  70. if (!shouldUsePopper) {
  71. menu = (0, _extends2["default"])({}, childArgs, {
  72. props: menuProps
  73. });
  74. } else {
  75. menu = (0, _extends2["default"])({}, popper, {}, childArgs, {
  76. props: (0, _extends2["default"])({}, menuProps, {
  77. style: popper.styles
  78. }),
  79. arrowProps: {
  80. ref: attachArrowRef,
  81. style: popper.arrowStyles
  82. }
  83. });
  84. }
  85. (0, _useRootClose["default"])(menuElement, handleClose, {
  86. clickTrigger: rootCloseEvent,
  87. disabled: !(menu && show)
  88. });
  89. return menu;
  90. }
  91. var propTypes = {
  92. /**
  93. * A render prop that returns a Menu element. The `props`
  94. * argument should spread through to **a component that can accept a ref**.
  95. *
  96. * @type {Function ({
  97. * show: boolean,
  98. * alignEnd: boolean,
  99. * close: (?SyntheticEvent) => void,
  100. * placement: Placement,
  101. * outOfBoundaries: ?boolean,
  102. * scheduleUpdate: () => void,
  103. * props: {
  104. * ref: (?HTMLElement) => void,
  105. * style: { [string]: string | number },
  106. * aria-labelledby: ?string
  107. * },
  108. * arrowProps: {
  109. * ref: (?HTMLElement) => void,
  110. * style: { [string]: string | number },
  111. * },
  112. * }) => React.Element}
  113. */
  114. children: _propTypes["default"].func.isRequired,
  115. /**
  116. * Controls the visible state of the menu, generally this is
  117. * provided by the parent `Dropdown` component,
  118. * but may also be specified as a prop directly.
  119. */
  120. show: _propTypes["default"].bool,
  121. /**
  122. * Aligns the dropdown menu to the 'end' of it's placement position.
  123. * Generally this is provided by the parent `Dropdown` component,
  124. * but may also be specified as a prop directly.
  125. */
  126. alignEnd: _propTypes["default"].bool,
  127. /**
  128. * Enables the Popper.js `flip` modifier, allowing the Dropdown to
  129. * automatically adjust it's placement in case of overlap with the viewport or toggle.
  130. * Refer to the [flip docs](https://popper.js.org/popper-documentation.html#modifiers..flip.enabled) for more info
  131. */
  132. flip: _propTypes["default"].bool,
  133. usePopper: _propTypes["default"].oneOf([true, false]),
  134. /**
  135. * A set of popper options and props passed directly to react-popper's Popper component.
  136. */
  137. popperConfig: _propTypes["default"].object,
  138. /**
  139. * Override the default event used by RootCloseWrapper.
  140. */
  141. rootCloseEvent: _propTypes["default"].string
  142. };
  143. var defaultProps = {
  144. usePopper: true
  145. };
  146. function DropdownMenu(_ref) {
  147. var children = _ref.children,
  148. options = (0, _objectWithoutPropertiesLoose2["default"])(_ref, ["children"]);
  149. var args = useDropdownMenu(options);
  150. return args.hasShown ? children(args) : null;
  151. }
  152. DropdownMenu.displayName = 'ReactOverlaysDropdownMenu';
  153. DropdownMenu.propTypes = propTypes;
  154. DropdownMenu.defaultProps = defaultProps;
  155. /** @component */
  156. var _default = DropdownMenu;
  157. exports["default"] = _default;