UNPKG

tdesign-mobile-vue

Version:
231 lines (225 loc) 7.42 kB
/** * tdesign v1.8.3 * (c) 2025 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('../_chunks/dep-3830a939.js'); require('../_chunks/dep-502b30ed.js'); require('../_chunks/dep-dcb71613.js'); require('@babel/runtime/helpers/typeof'); require('../_chunks/dep-2785f324.js'); require('../_chunks/dep-be12e3cf.js'); require('../_chunks/dep-0c65c975.js'); require('../_chunks/dep-489cc4a7.js'); 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/setStyle.js'); require('../_common/js/utils/helper.js'); require('@babel/runtime/helpers/toConsumableArray'); require('@babel/runtime/helpers/objectWithoutProperties'); require('@babel/runtime/helpers/slicedToArray'); require('../_chunks/dep-942c3444.js'); require('../_chunks/dep-1ee41e7f.js'); require('../_chunks/dep-6b4fd003.js'); require('../hooks/useClass.js'); require('../_chunks/dep-e0b95f1e.js'); require('../_common/js/global-config/mobile/default-config.js'); require('../_common/js/global-config/mobile/locale/zh_CN.js'); require('../_chunks/dep-18ad56fc.js'); require('../_chunks/dep-f9e965d5.js'); require('dayjs'); require('../_chunks/dep-6e709ab0.js'); require('../_chunks/dep-800d35e0.js'); require('../_chunks/dep-d15535dc.js'); require('../_chunks/dep-2d4b3b6e.js'); require('../_chunks/dep-75085caa.js'); require('../_chunks/dep-064922bf.js'); require('../_chunks/dep-031a2fb2.js'); require('../_chunks/dep-c63ef9fd.js'); require('../_chunks/dep-96271380.js'); require('../_chunks/dep-93bd9bb3.js'); require('../_chunks/dep-a5597253.js'); require('../_chunks/dep-43e3ffa1.js'); require('../_chunks/dep-806b2a5f.js'); require('../_chunks/dep-8fb38ffd.js'); require('../_chunks/dep-9e6af4c8.js'); require('../loading/icon/spinner.js'); require('../loading/props.js'); require('../hooks/tnode.js'); require('../hooks/render-tnode.js'); require('../_chunks/dep-73971288.js'); require('../_chunks/dep-3063ebb4.js'); require('../_chunks/dep-fe4c83ed.js'); require('../_chunks/dep-2a740630.js'); require('../_chunks/dep-efffe4f1.js'); require('../_chunks/dep-12a11698.js'); require('../_chunks/dep-7c008ce3.js'); require('../_chunks/dep-55bdb8ca.js'); 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