UNPKG

11.8 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.DefaultTabBar = exports.StateType = undefined;
7
8var _extends2 = require('babel-runtime/helpers/extends');
9
10var _extends3 = _interopRequireDefault(_extends2);
11
12var _createClass2 = require('babel-runtime/helpers/createClass');
13
14var _createClass3 = _interopRequireDefault(_createClass2);
15
16var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
17
18var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
19
20var _inherits2 = require('babel-runtime/helpers/inherits');
21
22var _inherits3 = _interopRequireDefault(_inherits2);
23
24var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
25
26var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
27
28var _react = require('react');
29
30var _react2 = _interopRequireDefault(_react);
31
32var _rcGesture = require('rc-gesture');
33
34var _rcGesture2 = _interopRequireDefault(_rcGesture);
35
36var _util = require('./util');
37
38function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
39
40var __rest = undefined && undefined.__rest || function (s, e) {
41 var t = {};
42 for (var p in s) {
43 if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
44 }if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
45 if (e.indexOf(p[i]) < 0) t[p[i]] = s[p[i]];
46 }return t;
47};
48
49var StateType = exports.StateType = function StateType() {
50 (0, _classCallCheck3['default'])(this, StateType);
51
52 this.transform = '';
53 this.isMoving = false;
54 this.showPrev = false;
55 this.showNext = false;
56};
57
58var DefaultTabBar = exports.DefaultTabBar = function (_React$PureComponent) {
59 (0, _inherits3['default'])(DefaultTabBar, _React$PureComponent);
60
61 function DefaultTabBar(props) {
62 (0, _classCallCheck3['default'])(this, DefaultTabBar);
63
64 var _this = (0, _possibleConstructorReturn3['default'])(this, (DefaultTabBar.__proto__ || Object.getPrototypeOf(DefaultTabBar)).call(this, props));
65
66 _this.onPan = function () {
67 var lastOffset = 0;
68 var finalOffset = 0;
69 var getLastOffset = function getLastOffset() {
70 var isVertical = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this.isTabBarVertical();
71
72 var offset = +('' + lastOffset).replace('%', '');
73 if (('' + lastOffset).indexOf('%') >= 0) {
74 offset /= 100;
75 offset *= isVertical ? _this.layout.clientHeight : _this.layout.clientWidth;
76 }
77 return offset;
78 };
79 return {
80 onPanStart: function onPanStart() {
81 _this.setState({ isMoving: true });
82 },
83 onPanMove: function onPanMove(status) {
84 if (!status.moveStatus || !_this.layout) return;
85 var isVertical = _this.isTabBarVertical();
86 var offset = getLastOffset() + (isVertical ? status.moveStatus.y : status.moveStatus.x);
87 var canScrollOffset = isVertical ? -_this.layout.scrollHeight + _this.layout.clientHeight : -_this.layout.scrollWidth + _this.layout.clientWidth;
88 offset = Math.min(offset, 0);
89 offset = Math.max(offset, canScrollOffset);
90 (0, _util.setPxStyle)(_this.layout, offset, 'px', isVertical);
91 finalOffset = offset;
92 _this.setState({
93 showPrev: -offset > 0,
94 showNext: offset > canScrollOffset
95 });
96 },
97 onPanEnd: function onPanEnd() {
98 var isVertical = _this.isTabBarVertical();
99 lastOffset = finalOffset;
100 _this.setState({
101 isMoving: false,
102 transform: (0, _util.getPxStyle)(finalOffset, 'px', isVertical)
103 });
104 },
105 setCurrentOffset: function setCurrentOffset(offset) {
106 return lastOffset = offset;
107 }
108 };
109 }();
110 _this.getTransformByIndex = function (props) {
111 var activeTab = props.activeTab,
112 tabs = props.tabs,
113 _props$page = props.page,
114 page = _props$page === undefined ? 0 : _props$page;
115
116 var isVertical = _this.isTabBarVertical();
117 var size = _this.getTabSize(page, tabs.length);
118 var center = page / 2;
119 var pos = Math.min(activeTab, tabs.length - center - .5);
120 var skipSize = Math.min(-(pos - center + .5) * size, 0);
121 _this.onPan.setCurrentOffset(skipSize + '%');
122 return {
123 transform: (0, _util.getPxStyle)(skipSize, '%', isVertical),
124 showPrev: activeTab > center - .5 && tabs.length > page,
125 showNext: activeTab < tabs.length - center - .5 && tabs.length > page
126 };
127 };
128 _this.onPress = function (index) {
129 var _this$props = _this.props,
130 goToTab = _this$props.goToTab,
131 onTabClick = _this$props.onTabClick,
132 tabs = _this$props.tabs;
133
134 onTabClick && onTabClick(tabs[index], index);
135 goToTab && goToTab(index);
136 };
137 _this.isTabBarVertical = function () {
138 var position = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this.props.tabBarPosition;
139 return position === 'left' || position === 'right';
140 };
141 _this.renderTab = function (t, i, size, isTabBarVertical) {
142 var _this$props2 = _this.props,
143 prefixCls = _this$props2.prefixCls,
144 renderTab = _this$props2.renderTab,
145 activeTab = _this$props2.activeTab,
146 tabBarTextStyle = _this$props2.tabBarTextStyle,
147 tabBarActiveTextColor = _this$props2.tabBarActiveTextColor,
148 tabBarInactiveTextColor = _this$props2.tabBarInactiveTextColor,
149 instanceId = _this$props2.instanceId;
150
151 var textStyle = (0, _extends3['default'])({}, tabBarTextStyle);
152 var cls = prefixCls + '-tab';
153 var ariaSelected = false;
154 if (activeTab === i) {
155 cls += ' ' + cls + '-active';
156 ariaSelected = true;
157 if (tabBarActiveTextColor) {
158 textStyle.color = tabBarActiveTextColor;
159 }
160 } else if (tabBarInactiveTextColor) {
161 textStyle.color = tabBarInactiveTextColor;
162 }
163 return _react2['default'].createElement(
164 'div',
165 { 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() {
166 return _this.onPress(i);
167 } },
168 renderTab ? renderTab(t) : t.title
169 );
170 };
171 _this.setContentLayout = function (div) {
172 _this.layout = div;
173 };
174 _this.getTabSize = function (page, tabLength) {
175 return 100 / Math.min(page, tabLength);
176 };
177 _this.state = (0, _extends3['default'])({}, new StateType(), _this.getTransformByIndex(props));
178 return _this;
179 }
180
181 (0, _createClass3['default'])(DefaultTabBar, [{
182 key: 'componentWillReceiveProps',
183 value: function componentWillReceiveProps(nextProps) {
184 if (this.props.activeTab !== nextProps.activeTab || this.props.tabs !== nextProps.tabs || this.props.tabs.length !== nextProps.tabs.length) {
185 this.setState((0, _extends3['default'])({}, this.getTransformByIndex(nextProps)));
186 }
187 }
188 }, {
189 key: 'render',
190 value: function render() {
191 var _this2 = this;
192
193 var _props = this.props,
194 prefixCls = _props.prefixCls,
195 animated = _props.animated,
196 _props$tabs = _props.tabs,
197 tabs = _props$tabs === undefined ? [] : _props$tabs,
198 _props$page2 = _props.page,
199 page = _props$page2 === undefined ? 0 : _props$page2,
200 _props$activeTab = _props.activeTab,
201 activeTab = _props$activeTab === undefined ? 0 : _props$activeTab,
202 tabBarBackgroundColor = _props.tabBarBackgroundColor,
203 tabBarUnderlineStyle = _props.tabBarUnderlineStyle,
204 tabBarPosition = _props.tabBarPosition,
205 renderUnderline = _props.renderUnderline;
206 var _state = this.state,
207 isMoving = _state.isMoving,
208 transform = _state.transform,
209 showNext = _state.showNext,
210 showPrev = _state.showPrev;
211
212 var isTabBarVertical = this.isTabBarVertical();
213 var needScroll = tabs.length > page;
214 var size = this.getTabSize(page, tabs.length);
215 var Tabs = tabs.map(function (t, i) {
216 return _this2.renderTab(t, i, size, isTabBarVertical);
217 });
218 var cls = prefixCls;
219 if (animated && !isMoving) {
220 cls += ' ' + prefixCls + '-animated';
221 }
222 var style = {
223 backgroundColor: tabBarBackgroundColor || ''
224 };
225 var transformStyle = needScroll ? (0, _extends3['default'])({}, (0, _util.getTransformPropValue)(transform)) : {};
226 var _a = this.onPan,
227 setCurrentOffset = _a.setCurrentOffset,
228 onPan = __rest(_a, ["setCurrentOffset"]);
229 var underlineProps = {
230 style: (0, _extends3['default'])({}, isTabBarVertical ? { height: size + '%' } : { width: size + '%' }, isTabBarVertical ? { top: size * activeTab + '%' } : { left: size * activeTab + '%' }, tabBarUnderlineStyle),
231 className: prefixCls + '-underline'
232 };
233 return _react2['default'].createElement(
234 'div',
235 { className: cls + ' ' + prefixCls + '-' + tabBarPosition, style: style },
236 showPrev && _react2['default'].createElement('div', { className: prefixCls + '-prevpage' }),
237 _react2['default'].createElement(
238 _rcGesture2['default'],
239 (0, _extends3['default'])({}, onPan, { direction: isTabBarVertical ? 'vertical' : 'horizontal' }),
240 _react2['default'].createElement(
241 'div',
242 { role: 'tablist', className: prefixCls + '-content', style: transformStyle, ref: this.setContentLayout },
243 Tabs,
244 renderUnderline ? renderUnderline(underlineProps) : _react2['default'].createElement('div', underlineProps)
245 )
246 ),
247 showNext && _react2['default'].createElement('div', { className: prefixCls + '-nextpage' })
248 );
249 }
250 }]);
251 return DefaultTabBar;
252}(_react2['default'].PureComponent);
253
254DefaultTabBar.defaultProps = {
255 prefixCls: 'rmc-tabs-tab-bar',
256 animated: true,
257 tabs: [],
258 goToTab: function goToTab() {},
259 activeTab: 0,
260 page: 5,
261 tabBarUnderlineStyle: {},
262 tabBarBackgroundColor: '#fff',
263 tabBarActiveTextColor: '',
264 tabBarInactiveTextColor: '',
265 tabBarTextStyle: {}
266};
\No newline at end of file