UNPKG

rmc-tabs

Version:

React Mobile Tabs Component(web & react-native)

266 lines (234 loc) 11.8 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.DefaultTabBar = exports.StateType = undefined; var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _rcGesture = require('rc-gesture'); var _rcGesture2 = _interopRequireDefault(_rcGesture); var _util = require('./util'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var __rest = undefined && undefined.__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; }if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0) t[p[i]] = s[p[i]]; }return t; }; var StateType = exports.StateType = function StateType() { (0, _classCallCheck3['default'])(this, StateType); this.transform = ''; this.isMoving = false; this.showPrev = false; this.showNext = false; }; var DefaultTabBar = exports.DefaultTabBar = function (_React$PureComponent) { (0, _inherits3['default'])(DefaultTabBar, _React$PureComponent); function DefaultTabBar(props) { (0, _classCallCheck3['default'])(this, DefaultTabBar); var _this = (0, _possibleConstructorReturn3['default'])(this, (DefaultTabBar.__proto__ || Object.getPrototypeOf(DefaultTabBar)).call(this, props)); _this.onPan = function () { var lastOffset = 0; var finalOffset = 0; var getLastOffset = function getLastOffset() { var isVertical = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this.isTabBarVertical(); var offset = +('' + lastOffset).replace('%', ''); if (('' + lastOffset).indexOf('%') >= 0) { offset /= 100; offset *= isVertical ? _this.layout.clientHeight : _this.layout.clientWidth; } return offset; }; return { onPanStart: function onPanStart() { _this.setState({ isMoving: true }); }, onPanMove: function onPanMove(status) { if (!status.moveStatus || !_this.layout) return; var isVertical = _this.isTabBarVertical(); var offset = getLastOffset() + (isVertical ? status.moveStatus.y : status.moveStatus.x); var canScrollOffset = isVertical ? -_this.layout.scrollHeight + _this.layout.clientHeight : -_this.layout.scrollWidth + _this.layout.clientWidth; offset = Math.min(offset, 0); offset = Math.max(offset, canScrollOffset); (0, _util.setPxStyle)(_this.layout, offset, 'px', isVertical); finalOffset = offset; _this.setState({ showPrev: -offset > 0, showNext: offset > canScrollOffset }); }, onPanEnd: function onPanEnd() { var isVertical = _this.isTabBarVertical(); lastOffset = finalOffset; _this.setState({ isMoving: false, transform: (0, _util.getPxStyle)(finalOffset, 'px', isVertical) }); }, setCurrentOffset: function setCurrentOffset(offset) { return lastOffset = offset; } }; }(); _this.getTransformByIndex = function (props) { var activeTab = props.activeTab, tabs = props.tabs, _props$page = props.page, page = _props$page === undefined ? 0 : _props$page; var isVertical = _this.isTabBarVertical(); var size = _this.getTabSize(page, tabs.length); var center = page / 2; var pos = Math.min(activeTab, tabs.length - center - .5); var skipSize = Math.min(-(pos - center + .5) * size, 0); _this.onPan.setCurrentOffset(skipSize + '%'); return { transform: (0, _util.getPxStyle)(skipSize, '%', isVertical), showPrev: activeTab > center - .5 && tabs.length > page, showNext: activeTab < tabs.length - center - .5 && tabs.length > page }; }; _this.onPress = function (index) { var _this$props = _this.props, goToTab = _this$props.goToTab, onTabClick = _this$props.onTabClick, tabs = _this$props.tabs; onTabClick && onTabClick(tabs[index], index); goToTab && goToTab(index); }; _this.isTabBarVertical = function () { var position = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this.props.tabBarPosition; return position === 'left' || position === 'right'; }; _this.renderTab = function (t, i, size, isTabBarVertical) { var _this$props2 = _this.props, prefixCls = _this$props2.prefixCls, renderTab = _this$props2.renderTab, activeTab = _this$props2.activeTab, tabBarTextStyle = _this$props2.tabBarTextStyle, tabBarActiveTextColor = _this$props2.tabBarActiveTextColor, tabBarInactiveTextColor = _this$props2.tabBarInactiveTextColor, instanceId = _this$props2.instanceId; var textStyle = (0, _extends3['default'])({}, tabBarTextStyle); var cls = prefixCls + '-tab'; var ariaSelected = false; if (activeTab === i) { cls += ' ' + cls + '-active'; ariaSelected = true; if (tabBarActiveTextColor) { textStyle.color = tabBarActiveTextColor; } } else if (tabBarInactiveTextColor) { textStyle.color = tabBarInactiveTextColor; } return _react2['default'].createElement( 'div', { key: 't_' + i, style: (0, _extends3['default'])({}, textStyle, isTabBarVertical ? { height: size + '%' } : { width: size + '%' }), id: 'm-tabs-' + instanceId + '-' + i, role: 'tab', 'aria-selected': ariaSelected, className: cls, onClick: function onClick() { return _this.onPress(i); } }, renderTab ? renderTab(t) : t.title ); }; _this.setContentLayout = function (div) { _this.layout = div; }; _this.getTabSize = function (page, tabLength) { return 100 / Math.min(page, tabLength); }; _this.state = (0, _extends3['default'])({}, new StateType(), _this.getTransformByIndex(props)); return _this; } (0, _createClass3['default'])(DefaultTabBar, [{ key: 'componentWillReceiveProps', value: function componentWillReceiveProps(nextProps) { if (this.props.activeTab !== nextProps.activeTab || this.props.tabs !== nextProps.tabs || this.props.tabs.length !== nextProps.tabs.length) { this.setState((0, _extends3['default'])({}, this.getTransformByIndex(nextProps))); } } }, { key: 'render', value: function render() { var _this2 = this; var _props = this.props, prefixCls = _props.prefixCls, animated = _props.animated, _props$tabs = _props.tabs, tabs = _props$tabs === undefined ? [] : _props$tabs, _props$page2 = _props.page, page = _props$page2 === undefined ? 0 : _props$page2, _props$activeTab = _props.activeTab, activeTab = _props$activeTab === undefined ? 0 : _props$activeTab, tabBarBackgroundColor = _props.tabBarBackgroundColor, tabBarUnderlineStyle = _props.tabBarUnderlineStyle, tabBarPosition = _props.tabBarPosition, renderUnderline = _props.renderUnderline; var _state = this.state, isMoving = _state.isMoving, transform = _state.transform, showNext = _state.showNext, showPrev = _state.showPrev; var isTabBarVertical = this.isTabBarVertical(); var needScroll = tabs.length > page; var size = this.getTabSize(page, tabs.length); var Tabs = tabs.map(function (t, i) { return _this2.renderTab(t, i, size, isTabBarVertical); }); var cls = prefixCls; if (animated && !isMoving) { cls += ' ' + prefixCls + '-animated'; } var style = { backgroundColor: tabBarBackgroundColor || '' }; var transformStyle = needScroll ? (0, _extends3['default'])({}, (0, _util.getTransformPropValue)(transform)) : {}; var _a = this.onPan, setCurrentOffset = _a.setCurrentOffset, onPan = __rest(_a, ["setCurrentOffset"]); var underlineProps = { style: (0, _extends3['default'])({}, isTabBarVertical ? { height: size + '%' } : { width: size + '%' }, isTabBarVertical ? { top: size * activeTab + '%' } : { left: size * activeTab + '%' }, tabBarUnderlineStyle), className: prefixCls + '-underline' }; return _react2['default'].createElement( 'div', { className: cls + ' ' + prefixCls + '-' + tabBarPosition, style: style }, showPrev && _react2['default'].createElement('div', { className: prefixCls + '-prevpage' }), _react2['default'].createElement( _rcGesture2['default'], (0, _extends3['default'])({}, onPan, { direction: isTabBarVertical ? 'vertical' : 'horizontal' }), _react2['default'].createElement( 'div', { role: 'tablist', className: prefixCls + '-content', style: transformStyle, ref: this.setContentLayout }, Tabs, renderUnderline ? renderUnderline(underlineProps) : _react2['default'].createElement('div', underlineProps) ) ), showNext && _react2['default'].createElement('div', { className: prefixCls + '-nextpage' }) ); } }]); return DefaultTabBar; }(_react2['default'].PureComponent); DefaultTabBar.defaultProps = { prefixCls: 'rmc-tabs-tab-bar', animated: true, tabs: [], goToTab: function goToTab() {}, activeTab: 0, page: 5, tabBarUnderlineStyle: {}, tabBarBackgroundColor: '#fff', tabBarActiveTextColor: '', tabBarInactiveTextColor: '', tabBarTextStyle: {} };