@coreui/react
Version:
CoreUI React 17 Bootstrap 4 components
116 lines (101 loc) • 4.92 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
import React, { useState, useContext, useEffect, createRef, isValidElement } from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import CIcon from '@coreui/icons-react';
import { useLocation } from 'react-router-dom';
import { Context } from './CSidebar';
export var DropdownContext = /*#__PURE__*/React.createContext({});
export var iconProps = function iconProps(icon) {
if (typeof icon === 'object') {
var _objectSpread2;
var key = icon.size ? 'className' : 'customClasses';
return _objectSpread(_objectSpread({}, icon), {}, (_objectSpread2 = {}, _objectSpread2["" + key] = icon.customClasses || "c-sidebar-nav-icon " + icon.className, _objectSpread2));
} else {
return {
customClasses: 'c-sidebar-nav-icon',
name: icon
};
}
}; //component - CoreUI / CSidebarNavDropdown
var CSidebarNavDropdown = function CSidebarNavDropdown(props) {
var children = props.children,
className = props.className,
innerRef = props.innerRef,
icon = props.icon,
fontIcon = props.fontIcon,
name = props.name,
show = props.show,
route = props.route,
attributes = _objectWithoutPropertiesLoose(props, ["children", "className", "innerRef", "icon", "fontIcon", "name", "show", "route"]);
var ref = /*#__PURE__*/createRef();
innerRef && innerRef(ref);
var _useContext = useContext(Context),
dropdownMode = _useContext.dropdownMode,
openDropdown = _useContext.openDropdown,
setOpenDropdown = _useContext.setOpenDropdown;
var _useState = useState(show),
isOpen = _useState[0],
setIsOpen = _useState[1];
useEffect(function () {
setIsOpen(show);
}, [show]);
useEffect(function () {
!dropdownMode && (!openDropdown || !ref.current.contains(openDropdown)) && setIsOpen(false);
}, [openDropdown]);
var toggle = function toggle() {
!dropdownMode && setOpenDropdown(isOpen ? ref.current.parentNode.closest('.c-sidebar-nav-dropdown') : ref.current);
setIsOpen(!isOpen);
};
var path = '';
try {
path = useLocation().pathname;
} catch (e) {
console.warn(e);
}
useEffect(function () {
if (dropdownMode === 'close') {
setIsOpen(false);
} else if (dropdownMode === 'closeInactive' && route) {
setIsOpen(path.includes(route));
} else if ((!dropdownMode || dropdownMode !== 'noAction') && !isOpen && route) {
setIsOpen(path.includes(route));
}
}, [path]); //render
var classes = classNames('c-sidebar-nav-dropdown', isOpen && 'c-show', className);
var iconClasses = classNames('c-sidebar-nav-icon', fontIcon);
return /*#__PURE__*/React.createElement("li", _extends({
className: classes
}, attributes, {
ref: ref
}), /*#__PURE__*/React.createElement("a", {
className: "c-sidebar-nav-dropdown-toggle",
tabIndex: "0",
onClick: toggle,
"aria-label": "menu dropdown"
}, icon && ( /*#__PURE__*/isValidElement(icon) ? icon : /*#__PURE__*/React.createElement(CIcon, iconProps(icon))), fontIcon && /*#__PURE__*/React.createElement("i", {
className: iconClasses
}), name), /*#__PURE__*/React.createElement("ul", {
className: "c-sidebar-nav-dropdown-items"
}, /*#__PURE__*/React.createElement(DropdownContext.Provider, {
value: {
isOpen: isOpen
}
}, children)));
};
CSidebarNavDropdown.propTypes = {
className: PropTypes.oneOfType([PropTypes.string, PropTypes.array, PropTypes.object]),
children: PropTypes.node,
//
innerRef: PropTypes.oneOfType([PropTypes.object, PropTypes.func]),
name: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
icon: PropTypes.oneOfType([PropTypes.object, PropTypes.string]),
fontIcon: PropTypes.string,
show: PropTypes.bool,
route: PropTypes.string
};
export default CSidebarNavDropdown;