tdesign-mobile-vue
Version:
tdesign-mobile-vue
212 lines (206 loc) • 6.55 kB
JavaScript
/**
* tdesign v1.7.0
* (c) 2024 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('../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