linkmore-design
Version:
π πlmη»δ»ΆεΊγπ
186 lines (184 loc) β’ 8.23 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
var _excluded = ["prefixCls", "className", "trigger", "children", "defaultCollapsed", "theme", "style", "collapsible", "reverseArrow", "width", "collapsedWidth", "zeroWidthTriggerStyle", "breakpoint", "onCollapse", "onBreakpoint"];
import BarsOutlined from '@ant-design/icons/BarsOutlined';
import LeftOutlined from '@ant-design/icons/LeftOutlined';
import RightOutlined from '@ant-design/icons/RightOutlined';
import classNames from 'classnames';
import omit from 'rc-util/lib/omit';
import * as React from 'react';
import { useContext, useEffect, useRef, useState } from 'react';
import { ConfigContext } from "../config-provider";
import isNumeric from "../_util/isNumeric";
import { LayoutContext } from "./layout";
var dimensionMaxMap = {
xs: '479.98px',
sm: '575.98px',
md: '767.98px',
lg: '991.98px',
xl: '1199.98px',
xxl: '1599.98px'
};
export var SiderContext = /*#__PURE__*/React.createContext({});
var generateId = function () {
var i = 0;
return function () {
var prefix = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
i += 1;
return "".concat(prefix).concat(i);
};
}();
var Sider = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
var customizePrefixCls = _ref.prefixCls,
className = _ref.className,
trigger = _ref.trigger,
children = _ref.children,
_ref$defaultCollapsed = _ref.defaultCollapsed,
defaultCollapsed = _ref$defaultCollapsed === void 0 ? false : _ref$defaultCollapsed,
_ref$theme = _ref.theme,
theme = _ref$theme === void 0 ? 'dark' : _ref$theme,
_ref$style = _ref.style,
style = _ref$style === void 0 ? {} : _ref$style,
_ref$collapsible = _ref.collapsible,
collapsible = _ref$collapsible === void 0 ? false : _ref$collapsible,
_ref$reverseArrow = _ref.reverseArrow,
reverseArrow = _ref$reverseArrow === void 0 ? false : _ref$reverseArrow,
_ref$width = _ref.width,
width = _ref$width === void 0 ? 200 : _ref$width,
_ref$collapsedWidth = _ref.collapsedWidth,
collapsedWidth = _ref$collapsedWidth === void 0 ? 80 : _ref$collapsedWidth,
zeroWidthTriggerStyle = _ref.zeroWidthTriggerStyle,
breakpoint = _ref.breakpoint,
onCollapse = _ref.onCollapse,
onBreakpoint = _ref.onBreakpoint,
props = _objectWithoutProperties(_ref, _excluded);
var _useContext = useContext(LayoutContext),
siderHook = _useContext.siderHook;
var _useState = useState('collapsed' in props ? props.collapsed : defaultCollapsed),
_useState2 = _slicedToArray(_useState, 2),
collapsed = _useState2[0],
setCollapsed = _useState2[1];
var _useState3 = useState(false),
_useState4 = _slicedToArray(_useState3, 2),
below = _useState4[0],
setBelow = _useState4[1];
useEffect(function () {
if ('collapsed' in props) {
setCollapsed(props.collapsed);
}
}, [props.collapsed]);
var handleSetCollapsed = function handleSetCollapsed(value, type) {
if (!('collapsed' in props)) {
setCollapsed(value);
}
onCollapse === null || onCollapse === void 0 ? void 0 : onCollapse(value, type);
};
// ========================= Responsive =========================
var responsiveHandlerRef = useRef();
responsiveHandlerRef.current = function (mql) {
setBelow(mql.matches);
onBreakpoint === null || onBreakpoint === void 0 ? void 0 : onBreakpoint(mql.matches);
if (collapsed !== mql.matches) {
handleSetCollapsed(mql.matches, 'responsive');
}
};
useEffect(function () {
function responsiveHandler(mql) {
return responsiveHandlerRef.current(mql);
}
var mql;
if (typeof window !== 'undefined') {
var _window = window,
matchMedia = _window.matchMedia;
if (matchMedia && breakpoint && breakpoint in dimensionMaxMap) {
mql = matchMedia("(max-width: ".concat(dimensionMaxMap[breakpoint], ")"));
try {
mql.addEventListener('change', responsiveHandler);
} catch (error) {
mql.addListener(responsiveHandler);
}
responsiveHandler(mql);
}
}
return function () {
try {
var _mql;
(_mql = mql) === null || _mql === void 0 ? void 0 : _mql.removeEventListener('change', responsiveHandler);
} catch (error) {
var _mql2;
(_mql2 = mql) === null || _mql2 === void 0 ? void 0 : _mql2.removeListener(responsiveHandler);
}
};
}, [breakpoint]); // in order to accept dynamic 'breakpoint' property, we need to add 'breakpoint' into dependency array.
useEffect(function () {
var uniqueId = generateId('ant-sider-');
siderHook.addSider(uniqueId);
return function () {
return siderHook.removeSider(uniqueId);
};
}, []);
var toggle = function toggle() {
handleSetCollapsed(!collapsed, 'clickTrigger');
};
var _useContext2 = useContext(ConfigContext),
getPrefixCls = _useContext2.getPrefixCls;
var renderSider = function renderSider() {
var _classNames;
var prefixCls = getPrefixCls('layout-sider', customizePrefixCls);
var divProps = omit(props, ['collapsed']);
var rawWidth = collapsed ? collapsedWidth : width;
// use "px" as fallback unit for width
var siderWidth = isNumeric(rawWidth) ? "".concat(rawWidth, "px") : String(rawWidth);
// special trigger when collapsedWidth == 0
var zeroWidthTrigger = parseFloat(String(collapsedWidth || 0)) === 0 ? /*#__PURE__*/React.createElement("span", {
onClick: toggle,
className: classNames("".concat(prefixCls, "-zero-width-trigger"), "".concat(prefixCls, "-zero-width-trigger-").concat(reverseArrow ? 'right' : 'left')),
style: zeroWidthTriggerStyle
}, trigger || /*#__PURE__*/React.createElement(BarsOutlined, null)) : null;
var iconObj = {
expanded: reverseArrow ? /*#__PURE__*/React.createElement(RightOutlined, null) : /*#__PURE__*/React.createElement(LeftOutlined, null),
collapsed: reverseArrow ? /*#__PURE__*/React.createElement(LeftOutlined, null) : /*#__PURE__*/React.createElement(RightOutlined, null)
};
var status = collapsed ? 'collapsed' : 'expanded';
var defaultTrigger = iconObj[status];
var triggerDom = trigger !== null ? zeroWidthTrigger || /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-trigger"),
onClick: toggle,
style: {
width: siderWidth
}
}, trigger || defaultTrigger) : null;
var divStyle = _objectSpread(_objectSpread({}, style), {}, {
flex: "0 0 ".concat(siderWidth),
maxWidth: siderWidth,
// Fix width transition bug in IE11
minWidth: siderWidth,
// https://github.com/ant-design/ant-design/issues/6349
width: siderWidth
});
var siderCls = classNames(prefixCls, "".concat(prefixCls, "-").concat(theme), (_classNames = {}, _defineProperty(_classNames, "".concat(prefixCls, "-collapsed"), !!collapsed), _defineProperty(_classNames, "".concat(prefixCls, "-has-trigger"), collapsible && trigger !== null && !zeroWidthTrigger), _defineProperty(_classNames, "".concat(prefixCls, "-below"), !!below), _defineProperty(_classNames, "".concat(prefixCls, "-zero-width"), parseFloat(siderWidth) === 0), _classNames), className);
return /*#__PURE__*/React.createElement("aside", _extends({
className: siderCls
}, divProps, {
style: divStyle,
ref: ref
}), /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-children")
}, children), collapsible || below && zeroWidthTrigger ? triggerDom : null);
};
var contextValue = React.useMemo(function () {
return {
siderCollapsed: collapsed
};
}, [collapsed]);
return /*#__PURE__*/React.createElement(SiderContext.Provider, {
value: contextValue
}, renderSider());
});
if (process.env.NODE_ENV !== 'production') {
Sider.displayName = 'Sider';
}
export default Sider;