tdesign-mobile-vue
Version:
tdesign-mobile-vue
231 lines (225 loc) • 7.42 kB
JavaScript
/**
* tdesign v1.8.3
* (c) 2025 TDesign Group
* @license MIT
*/
;
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