UNPKG

@appbuckets/react-ui

Version:
179 lines (176 loc) 5.06 kB
import { __rest, __read, __assign } from 'tslib'; import * as React from 'react'; import clsx from 'clsx'; import { useElementType, useAutoControlledValue, } from '@appbuckets/react-ui-core'; import '../BucketTheme/BucketTheme.js'; import { useWithDefaultProps } from '../BucketTheme/BucketContext.js'; import Button from '../Button/Button.js'; import Popup from '../Popup/Popup.js'; import Menu from '../Menu/Menu.js'; /* -------- * Component Render * -------- */ var DropdownMenu = function (receivedProps) { var _a; var props = useWithDefaultProps('dropdownMenu', receivedProps); props.as; var basic = props.basic, children = props.children, className = props.className, closeOnItemClicked = props.closeOnItemClicked; props.content; var userDefinedDefaultOpen = props.defaultOpen, inverted = props.inverted, items = props.items, onClose = props.onClose, onItemClick = props.onItemClick, onOpen = props.onOpen, openOn = props.openOn, userDefinedOpen = props.open, position = props.position, trigger = props.trigger, rest = __rest(props, [ 'as', 'basic', 'children', 'className', 'closeOnItemClicked', 'content', 'defaultOpen', 'inverted', 'items', 'onClose', 'onItemClick', 'onOpen', 'openOn', 'open', 'position', 'trigger', ]); var ElementType = useElementType(DropdownMenu, receivedProps, props); var _b = __read( useAutoControlledValue(false, { defaultProp: userDefinedDefaultOpen, prop: userDefinedOpen, }), 2 ), open = _b[0], trySetOpen = _b[1]; var classes = clsx(open && 'open', 'dropdown', className); // ---- // Handlers // ---- var handleMenuOpen = function (e) { if (typeof onOpen === 'function') { onOpen(e, __assign(__assign({}, props), { open: true })); } trySetOpen(true); }; var handleMenuClose = function (e) { if (typeof onClose === 'function') { onClose(e, __assign(__assign({}, props), { open: false })); } trySetOpen(false); }; // ---- // Trigger Element // ---- var triggerElement = (_a = Button.create(trigger, { autoGenerateKey: false, overrideProps: function (defaultProps) { return { onClick: function (event, buttonProps) { /** Call user defined handler */ if (defaultProps.onClick) { defaultProps.onClick(event, buttonProps); } /** On trigger click toggle menu */ if (open) { handleMenuClose(event); } else { handleMenuOpen(event); } }, }; }, })) !== null && _a !== void 0 ? _a : undefined; // ---- // On Item Click Handlers // ---- var handleMenuItemClick = function (event, itemProps) { /** If a user defined handler for click on menu item exists, call it */ if (typeof onItemClick === 'function') { onItemClick(event, itemProps); } /** If the menu must be close on item click, call the handleCloseMenu */ if (closeOnItemClicked) { handleMenuClose(event); } }; // ---- // Component Render // ---- return React.createElement(Popup, { className: 'dropdown-container', portalProps: { open: open, closeOnDocumentClick: true, }, basic: basic, inverted: inverted, trigger: triggerElement, openOn: openOn, position: position, onOpen: handleMenuOpen, onClose: handleMenuClose, content: React.createElement( Menu, __assign({ avoidActive: true, text: true, vertical: true }, rest, { as: ElementType, className: classes, items: items, onItemClick: handleMenuItemClick, }), children ), // <ElementType {...rest} className={classes}> // { // Array.isArray(items) // ? items.map((item) => ( // MenuItem.create(item, { // autoGenerateKey: true, // overrideProps : ({ onClick, ...itemRest }) => ({ // onClick: (e: React.MouseEvent<HTMLElement>, itemProps: MenuItemProps) => { // /** Call defined itemClick handler */ // if (typeof onItemClick === 'function') { // onItemClick(e, itemProps); // } // // /** Call menu item click handler */ // if (onClick) { // onClick(e, itemProps); // } // // /** Check if must close the menu */ // if (closeOnItemClicked) { // handleMenuClose(e); // } // }, // ...itemRest // }) // }) // )) // : childrenUtils.isNil(children) ? content : children // } // </ElementType> }); }; DropdownMenu.displayName = 'DropdownMenu'; export { DropdownMenu as default };