"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.useDropdownMenu = useDropdownMenu; exports["default"] = void 0; var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _propTypes = _interopRequireDefault(require("prop-types")); var _react = require("react"); var _useCallbackRef2 = _interopRequireDefault(require("@restart/hooks/useCallbackRef")); var _DropdownContext = _interopRequireDefault(require("./DropdownContext")); var _usePopper = _interopRequireWildcard(require("./usePopper")); var _useRootClose = _interopRequireDefault(require("./useRootClose")); function useDropdownMenu(options) { var _modifiers$arrow; if (options === void 0) { options = {}; } var context = (0, _react.useContext)(_DropdownContext["default"]); var _useCallbackRef = (0, _useCallbackRef2["default"])(), arrowElement = _useCallbackRef[0], attachArrowRef = _useCallbackRef[1]; var hasShownRef = (0, _react.useRef)(false); var _options = options, flip = _options.flip, rootCloseEvent = _options.rootCloseEvent, _options$popperConfig = _options.popperConfig, popperConfig = _options$popperConfig === void 0 ? {} : _options$popperConfig, _options$usePopper = _options.usePopper, shouldUsePopper = _options$usePopper === void 0 ? true : _options$usePopper; var show = context.show == null ? options.show : context.show; var alignEnd = context.alignEnd == null ? options.alignEnd : context.alignEnd; if (show && !hasShownRef.current) { hasShownRef.current = true; } var handleClose = function handleClose(e) { if (!context.toggle) return; context.toggle(false, e); }; var drop = context.drop, setMenu = context.setMenu, menuElement = context.menuElement, toggleElement = context.toggleElement; var placement = alignEnd ? 'bottom-end' : 'bottom-start'; 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'; var modifiers = (0, _usePopper.toModifierMap)(popperConfig.modifiers); var popper = (0, _usePopper["default"])(toggleElement, menuElement, (0, _extends2["default"])({}, popperConfig, { placement: placement, enabled: !!(shouldUsePopper && show), modifiers: (0, _extends2["default"])({}, modifiers, { eventListeners: { enabled: !!show }, arrow: (0, _extends2["default"])({}, modifiers.arrow, { enabled: !!arrowElement, options: (0, _extends2["default"])({}, (_modifiers$arrow = modifiers.arrow) == null ? void 0 : _modifiers$arrow.options, { element: arrowElement }) }), flip: (0, _extends2["default"])({ enabled: !!flip }, modifiers.flip) }) })); var menu = null; var menuProps = { ref: setMenu, 'aria-labelledby': toggleElement && toggleElement.id }; var childArgs = { show: show, alignEnd: alignEnd, hasShown: hasShownRef.current, close: handleClose }; if (!shouldUsePopper) { menu = (0, _extends2["default"])({}, childArgs, { props: menuProps }); } else { menu = (0, _extends2["default"])({}, popper, {}, childArgs, { props: (0, _extends2["default"])({}, menuProps, { style: popper.styles }), arrowProps: { ref: attachArrowRef, style: popper.arrowStyles } }); } (0, _useRootClose["default"])(menuElement, handleClose, { clickTrigger: rootCloseEvent, disabled: !(menu && show) }); return menu; } var propTypes = { /** * A render prop that returns a Menu element. The `props` * argument should spread through to **a component that can accept a ref**. * * @type {Function ({ * show: boolean, * alignEnd: boolean, * close: (?SyntheticEvent) => void, * placement: Placement, * outOfBoundaries: ?boolean, * scheduleUpdate: () => void, * props: { * ref: (?HTMLElement) => void, * style: { [string]: string | number }, * aria-labelledby: ?string * }, * arrowProps: { * ref: (?HTMLElement) => void, * style: { [string]: string | number }, * }, * }) => React.Element} */ children: _propTypes["default"].func.isRequired, /** * Controls the visible state of the menu, generally this is * provided by the parent `Dropdown` component, * but may also be specified as a prop directly. */ show: _propTypes["default"].bool, /** * Aligns the dropdown menu to the 'end' of it's placement position. * Generally this is provided by the parent `Dropdown` component, * but may also be specified as a prop directly. */ alignEnd: _propTypes["default"].bool, /** * Enables the Popper.js `flip` modifier, allowing the Dropdown to * automatically adjust it's placement in case of overlap with the viewport or toggle. * Refer to the [flip docs](https://popper.js.org/popper-documentation.html#modifiers..flip.enabled) for more info */ flip: _propTypes["default"].bool, usePopper: _propTypes["default"].oneOf([true, false]), /** * A set of popper options and props passed directly to react-popper's Popper component. */ popperConfig: _propTypes["default"].object, /** * Override the default event used by RootCloseWrapper. */ rootCloseEvent: _propTypes["default"].string }; var defaultProps = { usePopper: true }; function DropdownMenu(_ref) { var children = _ref.children, options = (0, _objectWithoutPropertiesLoose2["default"])(_ref, ["children"]); var args = useDropdownMenu(options); return args.hasShown ? children(args) : null; } DropdownMenu.displayName = 'ReactOverlaysDropdownMenu'; DropdownMenu.propTypes = propTypes; DropdownMenu.defaultProps = defaultProps; /** @component */ var _default = DropdownMenu; exports["default"] = _default;