UNPKG

@kisstar/rc-ui

Version:

UI component library built with React Hooks.

100 lines (99 loc) 4.43 kB
var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; import React, { useState, useContext } from 'react'; import classNames from 'classnames'; import MenuContext from './MenuContext'; export var SubMenu = function (props) { var _a; var rootPrefixCls = props.rootPrefixCls, style = props.style, className = props.className, title = props.title, disabled = props.disabled, icon = props.icon, children = props.children, restPropse = __rest(props, ["rootPrefixCls", "style", "className", "title", "disabled", "icon", "children"]); var _b = useState(false), isOpened = _b[0], setIsOpened = _b[1]; var _c = useState(false), isSelected = _c[0], setIsSelected = _c[1]; var _d = useContext(MenuContext), mode = _d.mode, selectedKey = _d.selectedKey; var classes = classNames(rootPrefixCls + "-submenu", className, (_a = {}, _a[rootPrefixCls + "-submenu-disabled"] = disabled, _a[rootPrefixCls + "-submenu-selected"] = isSelected, _a[rootPrefixCls + "-submenu-open"] = isOpened, _a)); var handleClick = function () { if (disabled || mode === 'horizontal' || mode === 'responsive') return; setIsOpened(!isOpened); }; var onKeyDown = function () { if (disabled || mode === 'horizontal' || mode === 'responsive') return; setIsOpened(!isOpened); }; var handleMouseEnter = function () { if (disabled || mode === 'vertical') return; clearTimeout(SubMenu.mouseTimeout); SubMenu.mouseTimeout = setTimeout(function () { setIsOpened(true); }, 100); }; var handleMouseLeave = function () { if (disabled || mode === 'vertical') return; clearTimeout(SubMenu.mouseTimeout); SubMenu.mouseTimeout = setTimeout(function () { setIsOpened(false); }, 100); }; var renderChild = function () { var keys = []; var retChild = (React.createElement("ul", { role: "menu", onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, className: rootPrefixCls + " " + rootPrefixCls + "-vertical" }, React.Children.map(children, function (child) { var childElement = child; var type = childElement.type, key = childElement.key; var displayName = type.displayName; var strKey = key; keys.push(strKey); if (displayName === 'MenuItem') { return React.cloneElement(childElement, { eventKey: strKey, rootPrefixCls: rootPrefixCls, }); } throw Error("SubMenu's child can only be MenuItem"); }))); var newSelect = keys.includes(selectedKey); if (newSelect !== isSelected) { setIsSelected(newSelect); } // Let CSS decide whether to display it or not // if (!isOpened) { // return null; // } return retChild; }; return (React.createElement("li", __assign({ style: style, className: classes }, restPropse), React.createElement("div", { role: "button", tabIndex: -1, className: rootPrefixCls + "-submenu-title", onClick: handleClick, onKeyDown: onKeyDown, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave }, React.createElement("span", null, icon, title), React.createElement("i", { className: rootPrefixCls + "-submenu-arrow" })), renderChild())); }; SubMenu.displayName = 'SubMenu'; SubMenu.mouseTimeout = 0; export default SubMenu;