@kisstar/rc-ui
Version:
UI component library built with React Hooks.
100 lines (99 loc) • 4.43 kB
JavaScript
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;