Tabs.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. var _typeof3 = require("@babel/runtime/helpers/typeof");
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = void 0;
  8. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  9. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  10. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  11. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  12. var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
  13. var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
  14. var _classnames = _interopRequireDefault(require("classnames"));
  15. var _useMergedState5 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState"));
  16. var _isMobile = _interopRequireDefault(require("rc-util/lib/isMobile"));
  17. var _react = _interopRequireWildcard(require("react"));
  18. var React = _react;
  19. var _TabContext = _interopRequireDefault(require("./TabContext"));
  20. var _Wrapper = _interopRequireDefault(require("./TabNavList/Wrapper"));
  21. var _TabPanelList = _interopRequireDefault(require("./TabPanelList"));
  22. var _useAnimateConfig = _interopRequireDefault(require("./hooks/useAnimateConfig"));
  23. var _excluded = ["id", "prefixCls", "className", "items", "direction", "activeKey", "defaultActiveKey", "editable", "animated", "tabPosition", "tabBarGutter", "tabBarStyle", "tabBarExtraContent", "locale", "more", "destroyInactiveTabPane", "renderTabBar", "onChange", "onTabClick", "onTabScroll", "getPopupContainer", "popupClassName", "indicator"]; // Accessibility https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/Tab_Role
  24. function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
  25. function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof3(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
  26. /**
  27. * Should added antd:
  28. * - type
  29. *
  30. * Removed:
  31. * - onNextClick
  32. * - onPrevClick
  33. * - keyboard
  34. */
  35. // Used for accessibility
  36. var uuid = 0;
  37. var Tabs = /*#__PURE__*/React.forwardRef(function (props, ref) {
  38. var id = props.id,
  39. _props$prefixCls = props.prefixCls,
  40. prefixCls = _props$prefixCls === void 0 ? 'rc-tabs' : _props$prefixCls,
  41. className = props.className,
  42. items = props.items,
  43. direction = props.direction,
  44. activeKey = props.activeKey,
  45. defaultActiveKey = props.defaultActiveKey,
  46. editable = props.editable,
  47. animated = props.animated,
  48. _props$tabPosition = props.tabPosition,
  49. tabPosition = _props$tabPosition === void 0 ? 'top' : _props$tabPosition,
  50. tabBarGutter = props.tabBarGutter,
  51. tabBarStyle = props.tabBarStyle,
  52. tabBarExtraContent = props.tabBarExtraContent,
  53. locale = props.locale,
  54. more = props.more,
  55. destroyInactiveTabPane = props.destroyInactiveTabPane,
  56. renderTabBar = props.renderTabBar,
  57. onChange = props.onChange,
  58. onTabClick = props.onTabClick,
  59. onTabScroll = props.onTabScroll,
  60. getPopupContainer = props.getPopupContainer,
  61. popupClassName = props.popupClassName,
  62. indicator = props.indicator,
  63. restProps = (0, _objectWithoutProperties2.default)(props, _excluded);
  64. var tabs = React.useMemo(function () {
  65. return (items || []).filter(function (item) {
  66. return item && (0, _typeof2.default)(item) === 'object' && 'key' in item;
  67. });
  68. }, [items]);
  69. var rtl = direction === 'rtl';
  70. var mergedAnimated = (0, _useAnimateConfig.default)(animated);
  71. // ======================== Mobile ========================
  72. var _useState = (0, _react.useState)(false),
  73. _useState2 = (0, _slicedToArray2.default)(_useState, 2),
  74. mobile = _useState2[0],
  75. setMobile = _useState2[1];
  76. (0, _react.useEffect)(function () {
  77. // Only update on the client side
  78. setMobile((0, _isMobile.default)());
  79. }, []);
  80. // ====================== Active Key ======================
  81. var _useMergedState = (0, _useMergedState5.default)(function () {
  82. var _tabs$;
  83. return (_tabs$ = tabs[0]) === null || _tabs$ === void 0 ? void 0 : _tabs$.key;
  84. }, {
  85. value: activeKey,
  86. defaultValue: defaultActiveKey
  87. }),
  88. _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2),
  89. mergedActiveKey = _useMergedState2[0],
  90. setMergedActiveKey = _useMergedState2[1];
  91. var _useState3 = (0, _react.useState)(function () {
  92. return tabs.findIndex(function (tab) {
  93. return tab.key === mergedActiveKey;
  94. });
  95. }),
  96. _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
  97. activeIndex = _useState4[0],
  98. setActiveIndex = _useState4[1];
  99. // Reset active key if not exist anymore
  100. (0, _react.useEffect)(function () {
  101. var newActiveIndex = tabs.findIndex(function (tab) {
  102. return tab.key === mergedActiveKey;
  103. });
  104. if (newActiveIndex === -1) {
  105. var _tabs$newActiveIndex;
  106. newActiveIndex = Math.max(0, Math.min(activeIndex, tabs.length - 1));
  107. setMergedActiveKey((_tabs$newActiveIndex = tabs[newActiveIndex]) === null || _tabs$newActiveIndex === void 0 ? void 0 : _tabs$newActiveIndex.key);
  108. }
  109. setActiveIndex(newActiveIndex);
  110. }, [tabs.map(function (tab) {
  111. return tab.key;
  112. }).join('_'), mergedActiveKey, activeIndex]);
  113. // ===================== Accessibility ====================
  114. var _useMergedState3 = (0, _useMergedState5.default)(null, {
  115. value: id
  116. }),
  117. _useMergedState4 = (0, _slicedToArray2.default)(_useMergedState3, 2),
  118. mergedId = _useMergedState4[0],
  119. setMergedId = _useMergedState4[1];
  120. // Async generate id to avoid ssr mapping failed
  121. (0, _react.useEffect)(function () {
  122. if (!id) {
  123. setMergedId("rc-tabs-".concat(process.env.NODE_ENV === 'test' ? 'test' : uuid));
  124. uuid += 1;
  125. }
  126. }, []);
  127. // ======================== Events ========================
  128. function onInternalTabClick(key, e) {
  129. onTabClick === null || onTabClick === void 0 || onTabClick(key, e);
  130. var isActiveChanged = key !== mergedActiveKey;
  131. setMergedActiveKey(key);
  132. if (isActiveChanged) {
  133. onChange === null || onChange === void 0 || onChange(key);
  134. }
  135. }
  136. // ======================== Render ========================
  137. var sharedProps = {
  138. id: mergedId,
  139. activeKey: mergedActiveKey,
  140. animated: mergedAnimated,
  141. tabPosition: tabPosition,
  142. rtl: rtl,
  143. mobile: mobile
  144. };
  145. var tabNavBarProps = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, sharedProps), {}, {
  146. editable: editable,
  147. locale: locale,
  148. more: more,
  149. tabBarGutter: tabBarGutter,
  150. onTabClick: onInternalTabClick,
  151. onTabScroll: onTabScroll,
  152. extra: tabBarExtraContent,
  153. style: tabBarStyle,
  154. panes: null,
  155. getPopupContainer: getPopupContainer,
  156. popupClassName: popupClassName,
  157. indicator: indicator
  158. });
  159. return /*#__PURE__*/React.createElement(_TabContext.default.Provider, {
  160. value: {
  161. tabs: tabs,
  162. prefixCls: prefixCls
  163. }
  164. }, /*#__PURE__*/React.createElement("div", (0, _extends2.default)({
  165. ref: ref,
  166. id: id,
  167. className: (0, _classnames.default)(prefixCls, "".concat(prefixCls, "-").concat(tabPosition), (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(prefixCls, "-mobile"), mobile), "".concat(prefixCls, "-editable"), editable), "".concat(prefixCls, "-rtl"), rtl), className)
  168. }, restProps), /*#__PURE__*/React.createElement(_Wrapper.default, (0, _extends2.default)({}, tabNavBarProps, {
  169. renderTabBar: renderTabBar
  170. })), /*#__PURE__*/React.createElement(_TabPanelList.default, (0, _extends2.default)({
  171. destroyInactiveTabPane: destroyInactiveTabPane
  172. }, sharedProps, {
  173. animated: mergedAnimated
  174. }))));
  175. });
  176. if (process.env.NODE_ENV !== 'production') {
  177. Tabs.displayName = 'Tabs';
  178. }
  179. var _default = exports.default = Tabs;