ckgl/node_modules/vant/lib/swipe-cell/SwipeCell.js
2024-12-21 13:52:42 +08:00

194 lines
6.1 KiB
JavaScript

var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name2 in all)
__defProp(target, name2, { get: all[name2], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var stdin_exports = {};
__export(stdin_exports, {
default: () => stdin_default,
swipeCellProps: () => swipeCellProps
});
module.exports = __toCommonJS(stdin_exports);
var import_vue = require("vue");
var import_utils = require("../utils");
var import_use = require("@vant/use");
var import_use_touch = require("../composables/use-touch");
var import_use_expose = require("../composables/use-expose");
const [name, bem] = (0, import_utils.createNamespace)("swipe-cell");
const swipeCellProps = {
name: (0, import_utils.makeNumericProp)(""),
disabled: Boolean,
leftWidth: import_utils.numericProp,
rightWidth: import_utils.numericProp,
beforeClose: Function,
stopPropagation: Boolean
};
var stdin_default = (0, import_vue.defineComponent)({
name,
props: swipeCellProps,
emits: ["open", "close", "click"],
setup(props, {
emit,
slots
}) {
let opened;
let lockClick;
let startOffset;
let isInBeforeClosing;
const root = (0, import_vue.ref)();
const leftRef = (0, import_vue.ref)();
const rightRef = (0, import_vue.ref)();
const state = (0, import_vue.reactive)({
offset: 0,
dragging: false
});
const touch = (0, import_use_touch.useTouch)();
const getWidthByRef = (ref2) => ref2.value ? (0, import_use.useRect)(ref2).width : 0;
const leftWidth = (0, import_vue.computed)(() => (0, import_utils.isDef)(props.leftWidth) ? +props.leftWidth : getWidthByRef(leftRef));
const rightWidth = (0, import_vue.computed)(() => (0, import_utils.isDef)(props.rightWidth) ? +props.rightWidth : getWidthByRef(rightRef));
const open = (side) => {
state.offset = side === "left" ? leftWidth.value : -rightWidth.value;
if (!opened) {
opened = true;
emit("open", {
name: props.name,
position: side
});
}
};
const close = (position) => {
state.offset = 0;
if (opened) {
opened = false;
emit("close", {
name: props.name,
position
});
}
};
const toggle = (side) => {
const offset = Math.abs(state.offset);
const THRESHOLD = 0.15;
const threshold = opened ? 1 - THRESHOLD : THRESHOLD;
const width = side === "left" ? leftWidth.value : rightWidth.value;
if (width && offset > width * threshold) {
open(side);
} else {
close(side);
}
};
const onTouchStart = (event) => {
if (!props.disabled) {
startOffset = state.offset;
touch.start(event);
}
};
const onTouchMove = (event) => {
if (props.disabled) {
return;
}
const {
deltaX
} = touch;
touch.move(event);
if (touch.isHorizontal()) {
lockClick = true;
state.dragging = true;
const isEdge = !opened || deltaX.value * startOffset < 0;
if (isEdge) {
(0, import_utils.preventDefault)(event, props.stopPropagation);
}
state.offset = (0, import_utils.clamp)(deltaX.value + startOffset, -rightWidth.value, leftWidth.value);
}
};
const onTouchEnd = () => {
if (state.dragging) {
state.dragging = false;
toggle(state.offset > 0 ? "left" : "right");
setTimeout(() => {
lockClick = false;
}, 0);
}
};
const onClick = (position = "outside", event) => {
if (isInBeforeClosing) return;
emit("click", position);
if (opened && !lockClick) {
isInBeforeClosing = true;
(0, import_utils.callInterceptor)(props.beforeClose, {
args: [{
event,
name: props.name,
position
}],
done: () => {
isInBeforeClosing = false;
close(position);
},
canceled: () => isInBeforeClosing = false,
error: () => isInBeforeClosing = false
});
}
};
const getClickHandler = (position, stop) => (event) => {
if (stop) {
event.stopPropagation();
}
if (lockClick) {
return;
}
onClick(position, event);
};
const renderSideContent = (side, ref2) => {
const contentSlot = slots[side];
if (contentSlot) {
return (0, import_vue.createVNode)("div", {
"ref": ref2,
"class": bem(side),
"onClick": getClickHandler(side, true)
}, [contentSlot()]);
}
};
(0, import_use_expose.useExpose)({
open,
close
});
(0, import_use.useClickAway)(root, (event) => onClick("outside", event), {
eventName: "touchstart"
});
(0, import_use.useEventListener)("touchmove", onTouchMove, {
target: root
});
return () => {
var _a;
const wrapperStyle = {
transform: `translate3d(${state.offset}px, 0, 0)`,
transitionDuration: state.dragging ? "0s" : ".6s"
};
return (0, import_vue.createVNode)("div", {
"ref": root,
"class": bem(),
"onClick": getClickHandler("cell", lockClick),
"onTouchstartPassive": onTouchStart,
"onTouchend": onTouchEnd,
"onTouchcancel": onTouchEnd
}, [(0, import_vue.createVNode)("div", {
"class": bem("wrapper"),
"style": wrapperStyle
}, [renderSideContent("left", leftRef), (_a = slots.default) == null ? void 0 : _a.call(slots), renderSideContent("right", rightRef)])]);
};
}
});