UNPKG

@chatui/core

Version:

The React library for Chatbot UI

151 lines (150 loc) 5.74 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.Tabs = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _react = _interopRequireWildcard(require("react")); var _clsx = _interopRequireDefault(require("clsx")); var _smoothScroll = _interopRequireDefault(require("../../utils/smoothScroll")); var _useNextId = _interopRequireDefault(require("../../hooks/useNextId")); var _excluded = ["active", "index", "children", "onClick"], _excluded2 = ["active", "children"]; function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } var TabItem = function TabItem(props) { var active = props.active, index = props.index, children = props.children, onClick = props.onClick, others = (0, _objectWithoutProperties2.default)(props, _excluded); function handleClick(e) { onClick(index, e); } return /*#__PURE__*/_react.default.createElement("div", { className: "Tabs-navItem" }, /*#__PURE__*/_react.default.createElement("button", (0, _extends2.default)({ className: (0, _clsx.default)('Tabs-navLink', { active: active }), type: "button", role: "tab", "aria-selected": active, onClick: handleClick }, others), /*#__PURE__*/_react.default.createElement("span", null, children))); }; var TabsPane = function TabsPane(props) { var active = props.active, children = props.children, others = (0, _objectWithoutProperties2.default)(props, _excluded2); return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({ className: (0, _clsx.default)('Tabs-pane', { active: active }) }, others, { role: "tabpanel" }), children); }; var Tabs = exports.Tabs = function Tabs(props) { var className = props.className, _props$index = props.index, oIndex = _props$index === void 0 ? 0 : _props$index, color = props.color, size = props.size, scrollable = props.scrollable, hideNavIfOnlyOne = props.hideNavIfOnlyOne, children = props.children, onChange = props.onChange; var _useState = (0, _react.useState)(oIndex || 0), _useState2 = (0, _slicedToArray2.default)(_useState, 2), index = _useState2[0], setIndex = _useState2[1]; var indexRef = (0, _react.useRef)(index); var navRef = (0, _react.useRef)(null); var headers = []; var contents = []; var tabPaneId = (0, _useNextId.default)('tabs-'); function handleIndexChange(idx, e) { setIndex(idx); if (onChange) { onChange(idx, e); } } _react.default.Children.forEach(children, function (item, idx) { if (!item) return; var active = index === idx; var id = "".concat(tabPaneId, "-").concat(idx); headers.push(/*#__PURE__*/_react.default.createElement(TabItem, { active: active, index: idx, key: id, onClick: handleIndexChange, "aria-controls": id, tabIndex: active ? -1 : 0 }, item.props.label)); if (item.props.children) { contents.push(/*#__PURE__*/_react.default.createElement(TabsPane, { active: active, key: id, id: id }, item.props.children)); } }); (0, _react.useEffect)(function () { setIndex(oIndex); }, [oIndex]); var movePointer = (0, _react.useCallback)(function () { var nav = navRef.current; if (!nav) return; var currentNav = nav.children[indexRef.current]; if (!currentNav) return; var text = currentNav.querySelector('span'); if (!text) return; var _ref = currentNav, navWidth = _ref.offsetWidth, navOffsetLeft = _ref.offsetLeft; // 中心位的偏移量 var offsetLeftOfCenter = navOffsetLeft + navWidth / 2; if (scrollable) { (0, _smoothScroll.default)({ el: nav, to: offsetLeftOfCenter - nav.offsetWidth / 2, x: true }); } }, [scrollable]); (0, _react.useEffect)(function () { var nav = navRef.current; var ro; if (nav && 'ResizeObserver' in window) { ro = new ResizeObserver(movePointer); ro.observe(nav); } return function () { if (ro && nav) { ro.unobserve(nav); } }; }, [movePointer]); (0, _react.useEffect)(function () { indexRef.current = index; movePointer(); }, [index, movePointer]); var needNav = headers.length > (hideNavIfOnlyOne ? 1 : 0); return /*#__PURE__*/_react.default.createElement("div", { className: (0, _clsx.default)('Tabs', { 'Tabs--scrollable': scrollable }, className), "data-color": color, "data-size": size }, needNav && /*#__PURE__*/_react.default.createElement("div", { className: "Tabs-nav", role: "tablist", ref: navRef }, headers), /*#__PURE__*/_react.default.createElement("div", { className: "Tabs-content" }, contents)); };