UNPKG

tdesign-mobile-vue

Version:
212 lines (206 loc) 6.55 kB
/** * tdesign v1.7.0 * (c) 2024 TDesign Group * @license MIT */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var vue = require('vue'); var shared_dom = require('../shared/dom.js'); var config = require('../config.js'); var loading_index = require('../loading/index.js'); var configProvider_useConfig = require('../config-provider/useConfig.js'); require('lodash/isFunction'); require('lodash/isString'); require('../loading/loading.js'); require('@babel/runtime/helpers/defineProperty'); require('../loading/icon/gradient.js'); require('../_common/js/loading/circle-adapter.js'); require('../_common/js/utils/set-style.js'); require('../_common/js/utils/helper.js'); require('@babel/runtime/helpers/toConsumableArray'); require('@babel/runtime/helpers/objectWithoutProperties'); require('@babel/runtime/helpers/slicedToArray'); require('lodash/isNull'); require('lodash/isUndefined'); require('lodash/isNumber'); require('lodash/isArray'); require('../hooks/useClass.js'); require('lodash/cloneDeep'); require('../config-provider/context.js'); require('lodash/mergeWith'); require('lodash/merge'); require('../_common/js/global-config/mobile/default-config.js'); require('../_common/js/global-config/mobile/locale/zh_CN.js'); require('../_chunks/dep-8d930798.js'); require('@babel/runtime/helpers/typeof'); require('../_chunks/dep-a20a5149.js'); require('dayjs'); require('../loading/icon/spinner.js'); require('../loading/props.js'); require('../hooks/tnode.js'); require('lodash/camelCase'); require('lodash/kebabCase'); require('../hooks/render-tnode.js'); require('lodash/isEmpty'); require('lodash/isObject'); require('../loading/plugin.js'); require('../shared/component.js'); var prefix = config["default"].prefix; var _useConfig = configProvider_useConfig.useConfig("list"), globalConfig = _useConfig.globalConfig; var name = "".concat(prefix, "-pull-refresh"); function useTouch() { var startY = vue.ref(0); var deltaY = vue.ref(0); var start = function start(event) { startY.value = event.touches[0].clientY; deltaY.value = 0; }; var move = function move(event) { var touch = event.touches[0]; deltaY.value = touch.clientY - startY.value; }; return { startY: startY, deltaY: deltaY, start: start, move: move }; } var PULL_DISTANCE = 50; var ANIMATION_DURATION = 300; var TEXT_MAP = { loading: globalConfig.value.loading, pulling: globalConfig.value.pulling, loosing: globalConfig.value.loosing, success: globalConfig.value.success }; var SHOW_TEXT_LIST = ["pulling", "loosing", "success"]; var PullRefreshProps = { modelValue: Boolean }; var easeDistance = function easeDistance(distance, pullDistance) { if (distance > pullDistance) { if (distance < pullDistance * 2) { distance = pullDistance + (distance - pullDistance) / 2; } else { distance = pullDistance * 1.5 + (distance - pullDistance * 2) / 4; } } return Math.round(distance); }; function isElement(node) { var ELEMENT_NODE_TYPE = 1; return node.tagName !== "HTML" && node.tagName !== "BODY" && node.nodeType === ELEMENT_NODE_TYPE; } var getScrollParent = function getScrollParent(node) { var res = node; while (res && isElement(res)) { if (/auto|scroll/i.test(window.getComputedStyle(res).overflowY)) { return res; } res = res.parentNode; } }; var pullRefresh = vue.defineComponent({ name: name, components: { TLoading: loading_index.Loading }, props: PullRefreshProps, emits: ["refresh", "update:modelValue"], setup: function setup(props, _ref) { var emit = _ref.emit, slots = _ref.slots; var state = vue.reactive({ status: "normal", distance: 0, duration: 0 }); var setStatus = function setStatus(distance, isLoading) { state.distance = distance; if (isLoading) { state.status = "loading"; } else if (distance === 0) { state.status = "normal"; } else if (distance < PULL_DISTANCE) { state.status = "pulling"; } else { state.status = "loosing"; } }; var touch = useTouch(); var isTouchable = function isTouchable() { return state.status !== "loading" && state.status !== "success"; }; var isReachTop = function isReachTop(e) { var scrollParent = getScrollParent(e.target); return !scrollParent || !scrollParent.scrollTop; }; var onTouchStart = function onTouchStart(e) { if (!isReachTop(e)) return; if (isTouchable()) { state.duration = 0; touch.start(e); } }; var onTouchMove = function onTouchMove(e) { if (!isTouchable()) return; if (!isReachTop(e)) return; var deltaY = touch.deltaY; if (deltaY.value >= 0) { shared_dom.preventDefault(e, false); setStatus(easeDistance(deltaY.value, PULL_DISTANCE)); } touch.move(e); }; var onTouchEnd = function onTouchEnd() { state.duration = ANIMATION_DURATION; if (state.status === "loosing") { emit("update:modelValue", true); vue.nextTick(function () { return emit("refresh"); }); } else { setStatus(0); } }; var trackStyle = vue.computed(function () { return { transitionDuration: "".concat(state.duration, "ms"), transform: state.distance ? "translate3d(0, ".concat(state.distance, "px, 0)") : "" }; }); vue.watch(function () { return props.modelValue; }, function (value) { if (value) { setStatus(PULL_DISTANCE, true); } else { state.status = "success"; setTimeout(function () { setStatus(0, false); }, ANIMATION_DURATION); } }); return function () { return vue.createVNode("div", { "class": name }, [vue.createVNode("div", { "class": "".concat(name, "__track"), "style": trackStyle.value, "onTouchstart": onTouchStart, "onTouchmove": onTouchMove, "onTouchend": onTouchEnd, "onTouchcancel": onTouchEnd }, [vue.createVNode("div", { "class": "".concat(name, "__head") }, [SHOW_TEXT_LIST.includes(state.status) && vue.createVNode("div", null, [TEXT_MAP[state.status]]), state.status === "loading" && vue.createVNode(loading_index.Loading, { "text": globalConfig.value.loading }, null)]), slots.default && slots.default()])]); }; } }); exports["default"] = pullRefresh; //# sourceMappingURL=pull-refresh.js.map