UNPKG

@arco-design/web-react

Version:

Arco Design React UI Library.

169 lines (168 loc) 9.07 kB
"use strict"; 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 __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SiderContext = void 0; var react_1 = __importStar(require("react")); var classNames_1 = __importDefault(require("../_util/classNames")); var IconLeft_1 = __importDefault(require("../../icon/react-icon-cjs/IconLeft")); var IconRight_1 = __importDefault(require("../../icon/react-icon-cjs/IconRight")); var ConfigProvider_1 = require("../ConfigProvider"); var ResizeBox_1 = __importDefault(require("../ResizeBox")); var is_1 = require("../_util/is"); var responsiveObserve_1 = __importStar(require("../_util/responsiveObserve")); var useMergeValue_1 = __importDefault(require("../_util/hooks/useMergeValue")); exports.SiderContext = (0, react_1.createContext)({ siderCollapsed: false, collapsedWidth: 64, }); var generateId = (function () { var i = 0; return function (prefix) { if (prefix === void 0) { prefix = ''; } i += 1; return "" + prefix + i; }; })(); function Sider(props, ref) { var _a; var _b; var children = props.children, className = props.className, style = props.style, _c = props.theme, theme = _c === void 0 ? 'light' : _c, trigger = props.trigger, reverseArrow = props.reverseArrow, _d = props.collapsedWidth, collapsedWidth = _d === void 0 ? 48 : _d, _e = props.width, width = _e === void 0 ? 200 : _e, collapsible = props.collapsible, resizeDirections = props.resizeDirections, onSiderMount = props.onSiderMount, onSiderUnmount = props.onSiderUnmount, breakpoint = props.breakpoint, onBreakpoint = props.onBreakpoint, onCollapse = props.onCollapse, _f = props.resizeBoxProps, resizeBoxProps = _f === void 0 ? {} : _f; var uniqueId = generateId('arco-sider-'); var getPrefixCls = (0, react_1.useContext)(ConfigProvider_1.ConfigContext).getPrefixCls; var prefixCls = getPrefixCls('layout-sider'); var _g = __read((0, useMergeValue_1.default)(false, { value: 'collapsed' in props ? props.collapsed : undefined, defaultValue: props.defaultCollapsed, }), 2), collapsed = _g[0], setCollapsed = _g[1]; // Parsing props width from number to string, to be used as css property value. // Using px as the default unit var propsWidth = (0, is_1.isNumber)(width) ? width + "px" : String(width); var _collapsedWidth = (0, is_1.isNumber)(collapsedWidth) ? "" + collapsedWidth : String(collapsedWidth); var _h = __read((0, react_1.useState)(collapsed ? _collapsedWidth : propsWidth), 2), siderWidth = _h[0], setSiderWidth = _h[1]; var refResponsiveHandlerToken = (0, react_1.useRef)(null); // 提供给 ResponsiveHandler,使得其可以获得最新的 state 值 var refStateForResponsiveHandler = (0, react_1.useRef)(null); refStateForResponsiveHandler.current = { breakpoint: breakpoint, collapsed: collapsed, onCollapse: onCollapse, onBreakpoint: onBreakpoint, }; (0, react_1.useEffect)(function () { onSiderMount && onSiderMount(uniqueId); if (collapsible && breakpoint in responsiveObserve_1.responsiveMap) { refResponsiveHandlerToken.current = responsiveObserve_1.default.subscribe(function (screens, breakpointChecked) { var _a = refStateForResponsiveHandler.current, breakpoint = _a.breakpoint, collapsed = _a.collapsed, onCollapse = _a.onCollapse, onBreakpoint = _a.onBreakpoint; if (!breakpointChecked || breakpointChecked === breakpoint) { var nextCollapsed = !screens[breakpoint]; if (nextCollapsed !== collapsed) { setCollapsed(nextCollapsed); onCollapse && onCollapse(nextCollapsed, 'responsive'); } onBreakpoint && onBreakpoint(nextCollapsed); } }); } return function () { onSiderUnmount && onSiderUnmount(uniqueId); if (refResponsiveHandlerToken.current) { responsiveObserve_1.default.unsubscribe(refResponsiveHandlerToken.current); } }; }, []); (0, react_1.useEffect)(function () { // Parsing collapsed width from number to string, to be used as css property value. // Using px as the default unit var _collapsedWidth = (0, is_1.isNumber)(collapsedWidth) ? collapsedWidth + "px" : String(collapsedWidth); setSiderWidth(collapsed ? _collapsedWidth : propsWidth); }, [collapsed, propsWidth, collapsedWidth]); var resizable = (resizeDirections && (0, is_1.isArray)(resizeDirections)) || ((_b = resizeBoxProps.directions) === null || _b === void 0 ? void 0 : _b.length); var TagName = resizable ? ResizeBox_1.default : 'aside'; var renderTrigger = function () { var _a; var triggerIcon = trigger || (collapsed ? (reverseArrow ? (react_1.default.createElement(IconLeft_1.default, null)) : (react_1.default.createElement(IconRight_1.default, null))) : reverseArrow ? (react_1.default.createElement(IconRight_1.default, null)) : (react_1.default.createElement(IconLeft_1.default, null))); return collapsible && trigger !== null ? (react_1.default.createElement("div", { style: { width: siderWidth }, className: (0, classNames_1.default)(prefixCls + "-trigger", (_a = {}, _a[prefixCls + "-trigger-light"] = theme === 'light', _a)), onClick: function () { setCollapsed(!collapsed); onCollapse && onCollapse(!collapsed, 'clickTrigger'); } }, triggerIcon)) : null; }; var resizeProps = (0, react_1.useMemo)(function () { if (resizable) { return __assign(__assign({ component: 'aside' }, resizeBoxProps), { width: siderWidth, directions: resizeDirections, onMoving: function (event, size) { var _a; setSiderWidth(size.width + "px"); (_a = resizeBoxProps === null || resizeBoxProps === void 0 ? void 0 : resizeBoxProps.onMoving) === null || _a === void 0 ? void 0 : _a.call(resizeBoxProps, event, size); } }); } return {}; }, [resizable, resizeDirections, siderWidth, resizeBoxProps]); return (react_1.default.createElement(exports.SiderContext.Provider, { value: { siderCollapsed: collapsed, collapsedWidth: collapsedWidth, } }, react_1.default.createElement(TagName, __assign({ ref: ref, style: __assign({ width: siderWidth }, style), className: (0, classNames_1.default)(prefixCls, (_a = {}, _a[prefixCls + "-light"] = theme === 'light', _a[prefixCls + "-has-trigger"] = trigger !== null && collapsible, _a[prefixCls + "-collapsed"] = collapsed, _a), className) }, resizeProps), react_1.default.createElement("div", { className: prefixCls + "-children" }, children), renderTrigger()))); } var ForwardRefSider = (0, react_1.forwardRef)(Sider); var SiderComponent = ForwardRefSider; SiderComponent.displayName = 'LayoutSider'; SiderComponent.__ARCO_SIGN__ = 'sider'; exports.default = SiderComponent;