UNPKG

@nutui/nutui-react

Version:

京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序

288 lines (287 loc) 13.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "PullToRefresh", { enumerable: true, get: function() { return PullToRefresh; } }); var _interop_require_default = require("@swc/helpers/_/_interop_require_default"); var _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard"); var _async_to_generator = require("@swc/helpers/_/_async_to_generator"); var _define_property = require("@swc/helpers/_/_define_property"); var _instanceof = require("@swc/helpers/_/_instanceof"); var _object_spread = require("@swc/helpers/_/_object_spread"); var _object_spread_props = require("@swc/helpers/_/_object_spread_props"); var _sliced_to_array = require("@swc/helpers/_/_sliced_to_array"); var _ts_generator = require("@swc/helpers/_/_ts_generator"); var _react = /*#__PURE__*/ _interop_require_wildcard._(require("react")); var _classnames = /*#__PURE__*/ _interop_require_default._(require("classnames")); var _react1 = require("@use-gesture/react"); var _web = require("@react-spring/web"); var _iconsreact = require("@nutui/icons-react"); var _configprovider = require("../configprovider"); var _getscrollparent = require("../../utils/get-scroll-parent"); var _rubberband = require("../../utils/rubberband"); var _sleep = require("../../utils/sleep"); var _supportspassive = require("../../utils/supports-passive"); var _typings = require("../../utils/typings"); var defaultProps = (0, _object_spread_props._)((0, _object_spread._)({}, _typings.ComponentDefaults), { type: 'default', pullingText: '', canReleaseText: '', refreshingText: '', completeText: '', completeDelay: 500, disabled: false, headHeight: 80, threshold: 60, onRefresh: function onRefresh() {} }); var PullToRefresh = function PullToRefresh(p) { var doRefresh = function doRefresh() { return _doRefresh.apply(this, arguments); }; var classPrefix = 'nut-pulltorefresh'; var locale = (0, _configprovider.useConfig)().locale; var props = (0, _object_spread._)({}, defaultProps, p, { pullingText: p.pullingText || locale.pullToRefresh.pullingText, canReleaseText: p.canReleaseText || locale.pullToRefresh.canReleaseText, refreshingText: p.refreshingText || locale.pullToRefresh.refreshingText, completeText: p.completeText || locale.pullToRefresh.completeText }); var classes = (0, _classnames.default)(classPrefix, props.className, "".concat(classPrefix, "-").concat(props.type)); var headHeight = props.headHeight; var threshold = props.threshold; var _useState = (0, _sliced_to_array._)((0, _react.useState)('pulling'), 2), status = _useState[0], setStatus = _useState[1]; var _useSpring = (0, _sliced_to_array._)((0, _web.useSpring)(function() { return { from: { height: 0 }, config: { tension: 300, friction: 30, clamp: true } }; }), 2), springStyles = _useSpring[0], api = _useSpring[1]; var elementRef = (0, _react.useRef)(null); var pullingRef = (0, _react.useRef)(false); (0, _react.useEffect)(function() { var _elementRef_current; (_elementRef_current = elementRef.current) === null || _elementRef_current === void 0 ? void 0 : _elementRef_current.addEventListener('touchmove', function() {}); }, []); function _doRefresh() { _doRefresh = (0, _async_to_generator._)(function() { var e; return (0, _ts_generator._)(this, function(_state) { switch(_state.label){ case 0: api.start({ height: headHeight }); setStatus('refreshing'); _state.label = 1; case 1: _state.trys.push([ 1, 3, , 4 ]); return [ 4, props.onRefresh() ]; case 2: _state.sent(); setStatus('complete'); return [ 3, 4 ]; case 3: e = _state.sent(); api.start({ to: /*#__PURE__*/ function() { var _ref = (0, _async_to_generator._)(function(next) { return (0, _ts_generator._)(this, function(_state) { switch(_state.label){ case 0: return [ 4, next({ height: 0 }) ]; case 1: _state.sent(); setStatus('pulling'); return [ 2 ]; } }); }); return function(next) { return _ref.apply(this, arguments); }; }() }); throw e; case 4: if (!(props.completeDelay > 0)) return [ 3, 6 ]; return [ 4, (0, _sleep.sleep)(props.completeDelay) ]; case 5: _state.sent(); _state.label = 6; case 6: api.start({ to: /*#__PURE__*/ function() { var _ref = (0, _async_to_generator._)(function(next) { return (0, _ts_generator._)(this, function(_state) { switch(_state.label){ case 0: return [ 4, next({ height: 0 }) ]; case 1: _state.sent(); setStatus('pulling'); return [ 2 ]; } }); }); return function(next) { return _ref.apply(this, arguments); }; }() }); return [ 2 ]; } }); }); return _doRefresh.apply(this, arguments); } (0, _react1.useDrag)(function(state) { var getScrollTop = function getScrollTop(element) { return 'scrollTop' in element ? element.scrollTop : element.scrollY; }; if (status === 'refreshing' || status === 'complete') return; var event = state.event; // 最后一个事件,检查是否可以刷新或是否是开始状态(第一个状态也是最后一个状态) if (state.last) { pullingRef.current = false; if (status === 'canRelease') { doRefresh(); } else { api.start({ height: 0 }); } return; } // 手指位置 var _state_movement = (0, _sliced_to_array._)(state.movement, 2), y = _state_movement[1]; // 第一个事件,并且手指位置大于0 if (state.first && y > 0) { var target = state.event.target; if (!target || !(0, _instanceof._)(target, Element)) return; var scrollParent = (0, _getscrollparent.getScrollParent)(target); while(true){ if (!scrollParent) return; var scrollTop = getScrollTop(scrollParent); if (scrollTop > 0) { return; } // 查找到 window 说明到顶了 if ((0, _instanceof._)(scrollParent, Window)) { break; } // 递归查找 scrollParent = (0, _getscrollparent.getScrollParent)(scrollParent.parentNode); } pullingRef.current = true; } if (!pullingRef.current) return; if (event.cancelable) { event.preventDefault(); } event.stopPropagation(); var height = Math.max((0, _rubberband.rubberbandIfOutOfBounds)(y, 0, 0, headHeight * 5, 0.5), 0); api.start({ height: height }); setStatus(height > threshold ? 'canRelease' : 'pulling'); }, { pointer: { touch: true }, axis: 'y', target: elementRef, enabled: !props.disabled, eventOptions: _supportspassive.passiveSupported ? { passive: false } : false }); var renderIcons = function renderIcons(status) { return /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/ _react.default.createElement("i", { className: "".concat(classPrefix, "-head-content-icons") }, (status === 'pulling' || status === 'complete') && /*#__PURE__*/ _react.default.createElement(_iconsreact.Loading, null), (status === 'canRelease' || status === 'refreshing') && /*#__PURE__*/ _react.default.createElement(_iconsreact.More, null))); }; var renderStatusIcon = function renderStatusIcon() { if (props.renderIcon) { var _props_renderIcon; return (_props_renderIcon = props.renderIcon) === null || _props_renderIcon === void 0 ? void 0 : _props_renderIcon.call(props, status); } return renderIcons(status); }; var renderStatusText = function renderStatusText() { if (props.renderText) { var _props_renderText; return (_props_renderText = props.renderText) === null || _props_renderText === void 0 ? void 0 : _props_renderText.call(props, status); } if (status === 'pulling') return props.pullingText; if (status === 'canRelease') return props.canReleaseText; if (status === 'refreshing') return props.refreshingText; if (status === 'complete') return props.completeText; return ''; }; var _obj, _obj1, _obj2, _obj3, _obj4; return /*#__PURE__*/ _react.default.createElement(_web.animated.div, { ref: elementRef, className: classes, style: props.style }, /*#__PURE__*/ _react.default.createElement(_web.animated.div, { style: springStyles, className: (0, _classnames.default)((_obj = {}, (0, _define_property._)(_obj, "".concat(classPrefix, "-head"), true), (0, _define_property._)(_obj, "".concat(classPrefix, "-primary-head"), props.type === 'primary'), _obj)) }, /*#__PURE__*/ _react.default.createElement("div", { className: (0, _classnames.default)((_obj1 = {}, (0, _define_property._)(_obj1, "".concat(classPrefix, "-head-content"), true), (0, _define_property._)(_obj1, "".concat(classPrefix, "-primary-head-content"), props.type === 'primary'), _obj1)), style: { height: headHeight } }, /*#__PURE__*/ _react.default.createElement("div", { className: (0, _classnames.default)((_obj2 = {}, (0, _define_property._)(_obj2, "".concat(classPrefix, "-status-icon"), true), (0, _define_property._)(_obj2, "".concat(classPrefix, "-primary-status-icon"), props.type === 'primary'), _obj2)) }, renderStatusIcon()), /*#__PURE__*/ _react.default.createElement("div", { className: (0, _classnames.default)((_obj3 = {}, (0, _define_property._)(_obj3, "".concat(classPrefix, "-status-text"), true), (0, _define_property._)(_obj3, "".concat(classPrefix, "-primary-status-text"), props.type === 'primary'), _obj3)) }, renderStatusText()))), /*#__PURE__*/ _react.default.createElement("div", { className: (0, _classnames.default)((_obj4 = {}, (0, _define_property._)(_obj4, "".concat(classPrefix, "-content"), true), (0, _define_property._)(_obj4, "".concat(classPrefix, "-primary-content}"), props.type === 'primary'), _obj4)) }, props.children)); }; PullToRefresh.displayName = 'NutPullToRefresh';