UNPKG

@douyinfe/semi-ui

Version:

A modern, comprehensive, flexible design system and UI library. Connect DesignOps & DevOps. Quickly build beautiful React apps. Maintained by Douyin-fe team.

206 lines (205 loc) 7.21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireDefault(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _cssAnimation = _interopRequireDefault(require("../../_cssAnimation")); var _resizable = _interopRequireDefault(require("../../resizable/single/resizable")); var _semiIcons = require("@douyinfe/semi-icons"); var _index = require("../../index"); var _constants = require("@douyinfe/semi-foundation/lib/cjs/sidebar/constants"); var _baseComponent = _interopRequireDefault(require("../../_base/baseComponent")); var _propTypes = _interopRequireDefault(require("prop-types")); require("@douyinfe/semi-foundation/lib/cjs/sidebar/sidebar.css"); var _containerFoundation = _interopRequireDefault(require("@douyinfe/semi-foundation/lib/cjs/sidebar/containerFoundation")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const prefixCls = _constants.cssClasses.SIDEBAR; class Container extends _baseComponent.default { constructor(props) { super(props); this.handleKeyDown = e => { this.foundation.handleKeyDown(e); }; this.handleCancel = e => { this.foundation.handleCancel(e); }; this.renderHeader = () => { const { renderHeader } = this.props; const { onCancel, title, showClose } = this.props; const result = renderHeader === null || renderHeader === void 0 ? void 0 : renderHeader(); if (result) { return result; } return /*#__PURE__*/_react.default.createElement("div", { className: `${prefixCls}-container-header` }, /*#__PURE__*/_react.default.createElement("div", { className: `${prefixCls}-container-header-title` }, title), showClose && /*#__PURE__*/_react.default.createElement(_index.Button, { className: `${prefixCls}-container-header-closeBtn`, icon: /*#__PURE__*/_react.default.createElement(_semiIcons.IconClose, null), theme: "borderless", type: "tertiary", "aria-label": "close", onClick: onCancel, size: "small" })); }; this.innerContent = props => { var _a; const { animationClassName, animationStyle, animationEventsNeedBind } = props; const { containerRef } = this.props; const { children, style = {}, className } = this.props; return /*#__PURE__*/_react.default.createElement("div", Object.assign({ className: (0, _classnames.default)(`${prefixCls}-container`, { [className]: className, [animationClassName]: animationClassName }), ref: containerRef, style: Object.assign(Object.assign({}, style), animationStyle) }, animationEventsNeedBind), (_a = this.renderHeader) === null || _a === void 0 ? void 0 : _a.call(this), /*#__PURE__*/_react.default.createElement("div", { className: `${prefixCls}-container-content` }, children)); }; this.renderContent = () => { const { visible, resizable, minWidth, maxWidth, motion, defaultSize } = this.props; // const shouldRender = (this.props.visible || this.props.keepDOM) || (this.props.motion && !this.state.displayNone; const shouldRender = this.props.visible || this.props.motion && !this.state.displayNone; return /*#__PURE__*/_react.default.createElement(_cssAnimation.default, { startClassName: visible ? `${prefixCls}-animation-content_show` : `${prefixCls}-animation-content_hide`, animationState: visible ? 'enter' : 'leave', motion: motion, onAnimationEnd: this.foundation.handleAnimationEnd }, _ref => { let { animationClassName, animationStyle, animationEventsNeedBind } = _ref; return shouldRender ? resizable ? /*#__PURE__*/_react.default.createElement(_resizable.default, { enable: _constants.strings.DIRECTION, minWidth: minWidth, defaultSize: defaultSize, maxWidth: maxWidth }, this.innerContent({ animationClassName, animationStyle, animationEventsNeedBind })) : this.innerContent({ animationClassName, animationStyle, animationEventsNeedBind }) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null); }); }; this.state = { displayNone: !props.visible }; this.foundation = new _containerFoundation.default(this.adapter); } get adapter() { return Object.assign(Object.assign({}, super.adapter), { notifyCancel: e => { this.props.onCancel && this.props.onCancel(e); }, notifyVisibleChange: visible => { var _a, _b; (_b = (_a = this.props).afterVisibleChange) === null || _b === void 0 ? void 0 : _b.call(_a, visible); }, setOnKeyDownListener: () => { if (typeof window !== 'undefined') { window.addEventListener('keydown', this.handleKeyDown); } }, removeKeyDownListener: () => { if (typeof window !== 'undefined') { window.removeEventListener('keydown', this.handleKeyDown); } }, toggleDisplayNone: displayNone => { if (displayNone !== this.state.displayNone) { this.setState({ displayNone: displayNone }); } } }); } static getDerivedStateFromProps(props, prevState) { const newState = {}; if (props.visible && prevState.displayNone) { newState.displayNone = false; } return newState; } componentDidMount() { if (this.props.visible) { this.foundation.beforeShow(); } } componentDidUpdate(prevProps, prevState, snapshot) { // hide => show if (!prevProps.visible && this.props.visible) { this.foundation.beforeShow(); } if (!prevState.displayNone && this.state.displayNone) { this.foundation.afterHide(); } } componentWillUnmount() { if (this.props.visible) { this.foundation.destroy(); } } render() { return this.renderContent(); } } Container.propTypes = { title: _propTypes.default.node, style: _propTypes.default.object, visible: _propTypes.default.bool, motion: _propTypes.default.bool, minWidth: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]), maxWidth: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]), onCancel: _propTypes.default.func, afterVisibleChange: _propTypes.default.func, resizable: _propTypes.default.bool, defaultSize: _propTypes.default.object, children: _propTypes.default.node, className: _propTypes.default.string, renderHeader: _propTypes.default.func, showClose: _propTypes.default.bool }; Container.__SemiComponentName__ = "Sidebar.Container"; Container.defaultProps = { motion: true, minWidth: 150, showClose: true, resizable: true }; var _default = exports.default = Container;