UNPKG

rc-ptr

Version:
191 lines (149 loc) 5.33 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _defineProperty2 = require('babel-runtime/helpers/defineProperty'); var _defineProperty3 = _interopRequireDefault(_defineProperty2); var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); 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 _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); var _style = require('./style.css'); var _style2 = _interopRequireDefault(_style); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _rcIspinner = require('rc-ispinner'); var _rcIspinner2 = _interopRequireDefault(_rcIspinner); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _once = require('once'); var _once2 = _interopRequireDefault(_once); var _classes = require('classes'); var _classes2 = _interopRequireDefault(_classes); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var STAGE_INIT = 0; var STAGE_ROTATE = 1; var STAGE_LOADING = 2; var Ptr = function (_Component) { (0, _inherits3.default)(Ptr, _Component); function Ptr(props) { (0, _classCallCheck3.default)(this, Ptr); var _this = (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(Ptr).call(this, props)); _this.onscroll = function (e) { e.preventDefault(); var state = _this.state; if (state.stage === STAGE_LOADING) return; var top = _this.scrollable.scrollTop; if (top > -30) { _this.setState({ stage: STAGE_INIT }); } else if (top < -30) { _this.setState({ stage: STAGE_ROTATE }); } }; _this.ontouchend = function (e) { if (_this.state.stage === STAGE_ROTATE) { e.stopImmediatePropagation(); _this.refresh(); } }; _this.state = { stage: STAGE_INIT }; return _this; } (0, _createClass3.default)(Ptr, [{ key: 'componentDidMount', value: function componentDidMount() { var el = _reactDom2.default.findDOMNode(this); var scrollable = this.scrollable = findScrollable(el); if (!this.scrollable) throw new Error('scrollable element not found'); scrollable.addEventListener('scroll', this.onscroll, false); document.addEventListener('touchend', this.ontouchend); } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { if (this.scrollable) { this.scrollable.removeEventListener('scroll', this.onscroll, false); document.removeEventListener('touchend', this.ontouchend); } } }, { key: 'render', value: function render() { var _cx; var children = void 0; var stage = this.state.stage; if (stage === STAGE_LOADING) { if (this.props.spinner) { children = _react2.default.createElement(_rcIspinner2.default, { type: 'gray', width: 20 }); } else { children = this.props.children; } } else { children = null; } var className = (0, _classnames2.default)((_cx = {}, (0, _defineProperty3.default)(_cx, _style2.default.image, stage == STAGE_INIT || stage == STAGE_ROTATE), (0, _defineProperty3.default)(_cx, _style2.default.rotate, stage == STAGE_ROTATE), (0, _defineProperty3.default)(_cx, _style2.default.center, stage == STAGE_LOADING), _cx)); return _react2.default.createElement( 'div', { className: _style2.default.ptr }, _react2.default.createElement( 'div', { className: className }, children ) ); } }, { key: 'refresh', value: function refresh() { this.setState({ stage: STAGE_LOADING }); var scrollable = this.scrollable; scrollable.scrollTop = -30; var self = this; var cb = (0, _once2.default)(function () { scrollable.scrollTop = 0; self.setState({ stage: STAGE_INIT }); }); var res = this.props.callback(cb); if (res && typeof res.then === 'function') { res.then(cb, cb); } } }]); return Ptr; }(_react.Component); Ptr.defaultProps = { spinner: true }; Ptr.propTypes = { spinner: _propTypes2.default.bool, callback: _propTypes2.default.func.isRequired }; exports.default = Ptr; var body = document.body; function findScrollable(el) { while (el) { el = el.parentNode; if ((0, _classes2.default)(el).has('scrollable')) return el; if (el === body) return null; } }