zarm-mobile
Version:
UI for react.js
225 lines (184 loc) • 7.09 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _classnames = require('classnames');
var _classnames2 = _interopRequireDefault(_classnames);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var finished = true;
var angle = 0;
var error = false;
var flag = true;
function _getRandom(min, max) {
// 参数min为随机数最小值 max为随机数最大值 得到的随机数范围为[min,max]
return Math.floor(Math.random() * (max + 1 - min) + min);
}
function _addListenerMulti(el, s, fn) {
var evts = s.split(' ');
for (var i = 0, iLen = evts.length; i < iLen; i += 1) {
el.addEventListener(evts[i], fn, false);
}
}
var Lottery = function (_Component) {
_inherits(Lottery, _Component);
function Lottery(props) {
_classCallCheck(this, Lottery);
var _this = _possibleConstructorReturn(this, (Lottery.__proto__ || Object.getPrototypeOf(Lottery)).call(this, props));
_this.state = {
gift: '',
isStart: props.isStart || false
};
_this.num = props.option.length;
_this._transitionend = _this._transitionend.bind(_this);
return _this;
}
_createClass(Lottery, [{
key: 'componentDidMount',
value: function componentDidMount() {
_addListenerMulti(this.rotateArea, 'webkitTransitionEnd transitionend', this._transitionend);
}
}, {
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(nextProps) {
if (!nextProps.isStart) {
flag = true;
return;
}
this.num = nextProps.option.length;
this.onStart(nextProps.value);
}
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
finished = true;
flag = true;
}
// 完成
}, {
key: 'onComplete',
value: function onComplete(name) {
this.setState({ isStart: false });
this.props.onComplete(name);
}
// 开始
}, {
key: 'onStart',
value: function onStart(value) {
var _this2 = this;
this.setState({ isStart: true });
var res = this._findIndexOfArr(value);
if (res.length === 0) {
error = true;
this._runLottery(0.5);
return;
}
this.props.option.forEach(function (item, index) {
if (item.id === res[0].id) {
error = false;
_this2.setState({
gift: res[0].name
});
_this2._runLottery(index + 1);
}
});
}
// 出错
}, {
key: 'onError',
value: function onError() {
this.setState({ isStart: false });
this.props.onError();
}
}, {
key: '_findIndexOfArr',
value: function _findIndexOfArr(id) {
return this.props.option.filter(function (obj) {
return obj.id === id;
});
}
}, {
key: '_runLottery',
value: function _runLottery(index) {
if (!finished) {
return false;
}
finished = false;
angle = _getRandom(4, 6) * 360 - 360 / ('' + this.num) * ('' + (index - 0.5));
this.rotateArea.style.webkitTransform = 'rotate(' + angle + 'deg)';
this.rotateArea.style.webkitTransition = this.props.duration + 's';
this.rotateArea.style.transform = 'rotate(' + angle + 'deg)';
this.rotateArea.style.transition = this.props.duration + 's';
}
// 监听动画执行完成
}, {
key: '_transitionend',
value: function _transitionend() {
this.rotateArea.style.transform = 'rotate(' + angle % 360 + 'deg)';
this.rotateArea.style.transition = '0s';
finished = true;
flag = true;
error ? this.onError() : this.onComplete(this.state.gift);
}
}, {
key: 'render',
value: function render() {
var _this3 = this;
var cls = (0, _classnames2.default)({
'rotate-area': 'true'
});
var rotateItem = [];
for (var i = 1; i <= this.num; i += 1) {
rotateItem.push(_react2.default.createElement('div', {
key: i,
style: {
backgroundImage: 'url(' + this.props.option[i - 1].image + ')',
WebkitTransform: 'rotate(' + 360 / this.num * (i - 0.5) + 'deg)',
transform: 'rotate(' + 360 / this.num * (i - 0.5) + 'deg)'
},
className: 'award-item award-item' + i
}));
}
return _react2.default.createElement(
'div',
{ className: 'za-lottery' },
_react2.default.createElement(
'div',
{ className: cls, ref: function ref(rotateArea) {
_this3.rotateArea = rotateArea;
}, style: { backgroundImage: 'url(' + this.props.bgUrl + ')' } },
rotateItem
),
_react2.default.createElement('div', {
className: 'za-lottery-btn',
style: { backgroundImage: 'url(' + this.props.btnUrl + ')' },
onClick: function onClick() {
if (!flag) return;
flag = false;
_this3.props.onStart();
}
})
);
}
}]);
return Lottery;
}(_react.Component);
Lottery.propTypes = {
option: _propTypes2.default.arrayOf(_propTypes2.default.object),
duration: _propTypes2.default.number,
onStart: _propTypes2.default.func,
onComplete: _propTypes2.default.func
};
Lottery.defaultProps = {
duration: 2,
onStart: function onStart() {},
onComplete: function onComplete() {}
};
exports.default = Lottery;