UNPKG

choerodon-ui

Version:

An enterprise-class UI design language and React-based implementation

217 lines (185 loc) 7.75 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _classnames3 = _interopRequireDefault(require("classnames")); var _hammerjs = _interopRequireDefault(require("../hammerjs")); var _reactDom = _interopRequireDefault(require("react-dom")); var _utils = require("./utils"); var _default = { getInitialState: function getInitialState() { var _this$checkPagination = this.checkPaginationByKey(this.props.activeKey), hasPrevPage = _this$checkPagination.hasPrevPage, hasNextPage = _this$checkPagination.hasNextPage; return { hasPrevPage: hasPrevPage, hasNextPage: hasNextPage }; }, getDefaultProps: function getDefaultProps() { return { hammerOptions: {}, pageSize: 5, // per page show how many tabs speed: 7 // swipe speed, 1 to 10, more bigger more faster }; }, checkPaginationByKey: function checkPaginationByKey(activeKey) { var _this$props = this.props, panels = _this$props.panels, pageSize = _this$props.pageSize; var index = this.getIndexByKey(activeKey); var centerTabCount = Math.floor(pageSize / 2); // the basic rule is to make activeTab be shown in the center of TabBar viewport return { hasPrevPage: index - centerTabCount > 0, hasNextPage: index + centerTabCount < panels.length }; }, /** * used for props.activeKey setting, not for swipe callback */ getDeltaByKey: function getDeltaByKey(activeKey) { var pageSize = this.props.pageSize; var index = this.getIndexByKey(activeKey); var centerTabCount = Math.floor(pageSize / 2); var tabWidth = this.cache.tabWidth; var delta = (index - centerTabCount) * tabWidth * -1; return delta; }, getIndexByKey: function getIndexByKey(activeKey) { var panels = this.props.panels; var length = panels.length; for (var i = 0; i < length; i++) { if ((0, _utils.generateKey)(panels[i].key, i) === activeKey) { return i; } } return -1; }, checkPaginationByDelta: function checkPaginationByDelta(delta) { var totalAvaliableDelta = this.cache.totalAvaliableDelta; return { hasPrevPage: delta < 0, hasNextPage: -delta < totalAvaliableDelta }; }, setSwipePositionByKey: function setSwipePositionByKey(activeKey) { var _this$checkPagination2 = this.checkPaginationByKey(activeKey), hasPrevPage = _this$checkPagination2.hasPrevPage, hasNextPage = _this$checkPagination2.hasNextPage; var totalAvaliableDelta = this.cache.totalAvaliableDelta; this.setState({ hasPrevPage: hasPrevPage, hasNextPage: hasNextPage }); var delta; if (!hasPrevPage) { // the first page delta = 0; } else if (!hasNextPage) { // the last page delta = -totalAvaliableDelta; } else if (hasNextPage) { // the middle page delta = this.getDeltaByKey(activeKey); } this.cache.totalDelta = delta; this.setSwipePosition(); }, setSwipePosition: function setSwipePosition() { var _this$cache = this.cache, totalDelta = _this$cache.totalDelta, vertical = _this$cache.vertical; (0, _utils.setPxStyle)(this.swipeNode, totalDelta, vertical); }, componentDidMount: function componentDidMount() { var swipe = this.swipe, nav = this.nav; var _this$props2 = this.props, tabBarPosition = _this$props2.tabBarPosition, pageSize = _this$props2.pageSize, panels = _this$props2.panels, activeKey = _this$props2.activeKey; this.swipeNode = _reactDom["default"].findDOMNode(swipe); // dom which scroll (9999px) this.realNode = _reactDom["default"].findDOMNode(nav); // dom which visiable in screen (viewport) var _isVertical = (0, _utils.isVertical)(tabBarPosition); var _viewSize = (0, _utils.getStyle)(this.realNode, _isVertical ? 'height' : 'width'); var _tabWidth = _viewSize / pageSize; this.cache = { vertical: _isVertical, totalAvaliableDelta: _tabWidth * panels.length - _viewSize, tabWidth: _tabWidth }; this.setSwipePositionByKey(activeKey); }, componentWillReceiveProps: function componentWillReceiveProps(nextProps) { if (nextProps.activeKey && nextProps.activeKey !== this.props.activeKey) { this.setSwipePositionByKey(nextProps.activeKey); } }, onPan: function onPan(e) { var _this$cache2 = this.cache, vertical = _this$cache2.vertical, totalAvaliableDelta = _this$cache2.totalAvaliableDelta, totalDelta = _this$cache2.totalDelta; var speed = this.props.speed; // calculate touch distance var nowDelta = vertical ? e.deltaY : e.deltaX; nowDelta = nowDelta * (speed / 10); // calculate distance dom need transform var _nextDelta = nowDelta + totalDelta; if (_nextDelta >= 0) { _nextDelta = 0; } else if (_nextDelta <= -totalAvaliableDelta) { _nextDelta = -totalAvaliableDelta; } this.cache.totalDelta = _nextDelta; this.setSwipePosition(); // calculate pagination display var _this$checkPagination3 = this.checkPaginationByDelta(this.cache.totalDelta), hasPrevPage = _this$checkPagination3.hasPrevPage, hasNextPage = _this$checkPagination3.hasNextPage; if (hasPrevPage !== this.state.hasPrevPage || hasNextPage !== this.state.hasNextPage) { this.setState({ hasPrevPage: hasPrevPage, hasNextPage: hasNextPage }); } }, getSwipeBarNode: function getSwipeBarNode(tabs) { var _classnames2; var _this$props3 = this.props, prefixCls = _this$props3.prefixCls, hammerOptions = _this$props3.hammerOptions, tabBarPosition = _this$props3.tabBarPosition; var _this$state = this.state, hasPrevPage = _this$state.hasPrevPage, hasNextPage = _this$state.hasNextPage; var navClassName = "".concat(prefixCls, "-nav"); var navClasses = (0, _classnames3["default"])((0, _defineProperty2["default"])({}, navClassName, true)); var events = { onPan: this.onPan }; return _react["default"].createElement("div", { className: (0, _classnames3["default"])((_classnames2 = {}, (0, _defineProperty2["default"])(_classnames2, "".concat(prefixCls, "-nav-container"), 1), (0, _defineProperty2["default"])(_classnames2, "".concat(prefixCls, "-nav-swipe-container"), 1), (0, _defineProperty2["default"])(_classnames2, "".concat(prefixCls, "-prevpage"), hasPrevPage), (0, _defineProperty2["default"])(_classnames2, "".concat(prefixCls, "-nextpage"), hasNextPage), _classnames2)), key: "container", ref: this.saveRef('container') }, _react["default"].createElement("div", { className: "".concat(prefixCls, "-nav-wrap"), ref: this.saveRef('navWrap') }, _react["default"].createElement(_hammerjs["default"], (0, _extends2["default"])({}, events, { direction: (0, _utils.isVertical)(tabBarPosition) ? 'DIRECTION_ALL' : 'DIRECTION_HORIZONTAL', options: hammerOptions }), _react["default"].createElement("div", { className: "".concat(prefixCls, "-nav-swipe"), ref: this.saveRef('swipe') }, _react["default"].createElement("div", { className: navClasses, ref: this.saveRef('nav') }, tabs))))); } }; exports["default"] = _default; //# sourceMappingURL=SwipeableTabBarMixin.js.map