tdesign-mobile-vue
Version:
tdesign-mobile-vue
208 lines (204 loc) • 6.33 kB
JavaScript
/**
* tdesign v1.7.0
* (c) 2024 TDesign Group
* @license MIT
*/
import { defineComponent, reactive, computed, watch, createVNode, ref, nextTick } from 'vue';
import { preventDefault } from '../shared/dom.js';
import config from '../config.js';
import { Loading } from '../loading/index.js';
import { useConfig } from '../config-provider/useConfig.js';
import 'lodash/isFunction';
import 'lodash/isString';
import '../loading/loading.js';
import '@babel/runtime/helpers/defineProperty';
import '../loading/icon/gradient.js';
import '../_common/js/loading/circle-adapter.js';
import '../_common/js/utils/set-style.js';
import '../_common/js/utils/helper.js';
import '@babel/runtime/helpers/toConsumableArray';
import '@babel/runtime/helpers/objectWithoutProperties';
import '@babel/runtime/helpers/slicedToArray';
import 'lodash/isNull';
import 'lodash/isUndefined';
import 'lodash/isNumber';
import 'lodash/isArray';
import '../hooks/useClass.js';
import 'lodash/cloneDeep';
import '../config-provider/context.js';
import 'lodash/mergeWith';
import 'lodash/merge';
import '../_common/js/global-config/mobile/default-config.js';
import '../_common/js/global-config/mobile/locale/zh_CN.js';
import '../_chunks/dep-d5364bc4.js';
import '@babel/runtime/helpers/typeof';
import '../_chunks/dep-eb734424.js';
import 'dayjs';
import '../loading/icon/spinner.js';
import '../loading/props.js';
import '../hooks/tnode.js';
import 'lodash/camelCase';
import 'lodash/kebabCase';
import '../hooks/render-tnode.js';
import 'lodash/isEmpty';
import 'lodash/isObject';
import '../loading/plugin.js';
import '../shared/component.js';
var prefix = config.prefix;
var _useConfig = useConfig("list"),
globalConfig = _useConfig.globalConfig;
var name = "".concat(prefix, "-pull-refresh");
function useTouch() {
var startY = ref(0);
var deltaY = 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 = defineComponent({
name: name,
components: {
TLoading: Loading
},
props: PullRefreshProps,
emits: ["refresh", "update:modelValue"],
setup: function setup(props, _ref) {
var emit = _ref.emit,
slots = _ref.slots;
var state = 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) {
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);
nextTick(function () {
return emit("refresh");
});
} else {
setStatus(0);
}
};
var trackStyle = computed(function () {
return {
transitionDuration: "".concat(state.duration, "ms"),
transform: state.distance ? "translate3d(0, ".concat(state.distance, "px, 0)") : ""
};
});
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 createVNode("div", {
"class": name
}, [createVNode("div", {
"class": "".concat(name, "__track"),
"style": trackStyle.value,
"onTouchstart": onTouchStart,
"onTouchmove": onTouchMove,
"onTouchend": onTouchEnd,
"onTouchcancel": onTouchEnd
}, [createVNode("div", {
"class": "".concat(name, "__head")
}, [SHOW_TEXT_LIST.includes(state.status) && createVNode("div", null, [TEXT_MAP[state.status]]), state.status === "loading" && createVNode(Loading, {
"text": globalConfig.value.loading
}, null)]), slots.default && slots.default()])]);
};
}
});
export { pullRefresh as default };
//# sourceMappingURL=pull-refresh.js.map