vantui-edit
Version:
一套适用于Taro3及React的vantui组件库
331 lines (287 loc) • 11.9 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.SwipeCell = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _components = require("@tarojs/components");
var _react = require("react");
var _taro = require("@tarojs/taro");
var utils = _interopRequireWildcard(require("../wxs/utils"));
var _utils2 = require("../common/utils");
var _jsxRuntime = require("react/jsx-runtime");
var _excluded = ["leftWidth", "rightWidth", "style", "className", "disabled", "name", "onClick", "onOpen", "onClose", "asyncClose", "children", "renderRight", "renderLeft"];
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
var ARRAY = [];
var MIN_DISTANCE = 20;
function getDirection(x, y) {
if (x > y && x > MIN_DISTANCE) {
return 'horizontal';
}
if (y > x && y > MIN_DISTANCE) {
return 'vertical';
}
return '';
}
function Index(props, ref) {
var _useState = (0, _react.useState)({}),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
wrapperStyle = _useState2[0],
setWrapperStyle = _useState2[1];
var _useState3 = (0, _react.useState)(0),
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
offset = _useState4[0],
setOffset = _useState4[1];
var _useState5 = (0, _react.useState)({}),
_useState6 = (0, _slicedToArray2.default)(_useState5, 2),
instanceKey = _useState6[0],
setInstanceKey = _useState6[1];
var _useState7 = (0, _react.useState)({}),
_useState8 = (0, _slicedToArray2.default)(_useState7, 2),
touchState = _useState8[0],
setTouchState = _useState8[1];
var _useState9 = (0, _react.useState)(0),
_useState10 = (0, _slicedToArray2.default)(_useState9, 2),
startOffset = _useState10[0],
setStartOffset = _useState10[1];
var _useState11 = (0, _react.useState)({
left: 0.2,
right: 0.2
}),
_useState12 = (0, _slicedToArray2.default)(_useState11, 2),
THRESHOLD = _useState12[0],
setTHRESHOLD = _useState12[1];
var _props$leftWidth = props.leftWidth,
leftWidth = _props$leftWidth === void 0 ? 0 : _props$leftWidth,
_props$rightWidth = props.rightWidth,
rightWidth = _props$rightWidth === void 0 ? 0 : _props$rightWidth,
style = props.style,
className = props.className,
disabled = props.disabled,
_props$name = props.name,
name = _props$name === void 0 ? '' : _props$name,
onClick = props.onClick,
onOpen = props.onOpen,
onClose = props.onClose,
asyncClose = props.asyncClose,
children = props.children,
renderRight = props.renderRight,
renderLeft = props.renderLeft,
others = (0, _objectWithoutProperties2.default)(props, _excluded);
var swipeMove = (0, _react.useCallback)(function () {
var offset2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
var dragging = arguments.length > 1 ? arguments[1] : undefined;
var offset_ = (0, _utils2.range)(offset2, -rightWidth, leftWidth);
setOffset(offset_);
if (offset2 === 0) {
setTHRESHOLD({
left: 0.2,
right: 0.2
});
}
var transform = "translate3d(".concat(offset_, "px, 0, 0)");
var transition = dragging ? 'none' : 'transform .6s cubic-bezier(0.18, 0.89, 0.32, 1)';
var wrapperStyle_ = _objectSpread(_objectSpread({}, wrapperStyle), {}, {
'-webkit-transform': transform,
'-webkit-transition': transition,
transform: transform,
transition: transition
});
setWrapperStyle(wrapperStyle_);
}, [leftWidth, rightWidth, wrapperStyle]);
var close = (0, _react.useCallback)(function () {
swipeMove(0, false);
}, [swipeMove]);
(0, _react.useEffect)(function () {
var k = new Date();
if (JSON.stringify(instanceKey) === '{}') {
setInstanceKey({
key: k,
close: close
});
ARRAY.push({
key: k,
close: close
});
}
}, [close, instanceKey]);
(0, _react.useEffect)(function () {
return function () {
ARRAY = ARRAY.filter(function (item) {
return item.key !== instanceKey.key;
});
}; // eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
var resetTouchStatus = (0, _react.useCallback)(function () {
setTouchState(_objectSpread(_objectSpread({}, touchState), {}, {
direction: '',
deltaX: 0,
deltaY: 0,
offsetX: 0,
offsetY: 0,
startX: 0,
startY: 0
}));
}, [touchState]);
var touchStart = (0, _react.useCallback)(function (event) {
resetTouchStatus();
var touch = event.touches[0];
setTouchState(_objectSpread(_objectSpread({}, touchState), {}, {
startX: touch.clientX,
startY: touch.clientY
}));
}, [touchState, resetTouchStatus]);
var touchMove = (0, _react.useCallback)(function (event) {
resetTouchStatus();
var touch = event.touches[0];
var newTouchState = _objectSpread(_objectSpread({}, touchState), {}, {
direction: touchState.direction || getDirection(Math.abs(touch.clientX - (touchState.startX || 0)), Math.abs(touch.clientY - (touchState.startY || 0))),
deltaX: touch.clientX - (touchState.startX || 0),
deltaY: touch.clientY - (touchState.startY || 0),
offsetX: Math.abs(touchState.deltaX),
offsetY: Math.abs(touchState.deltaY)
});
setTouchState(newTouchState);
return newTouchState;
}, [touchState, resetTouchStatus]);
var open = (0, _react.useCallback)(function (position) {
var offset = position === 'left' ? leftWidth : -rightWidth;
var THRESHOLD_ = {
left: 0.2,
right: 0.2
};
if (position === 'left') {
THRESHOLD_.left = 0.8;
}
if (position === 'right') {
THRESHOLD_.right = 0.8;
}
setTHRESHOLD(THRESHOLD_);
swipeMove(offset, false);
if (onOpen) {
var e = {
detail: {
position: position,
name: name
}
};
onOpen(e);
}
}, [leftWidth, onOpen, rightWidth, swipeMove, name]);
var swipeLeaveTransition = (0, _react.useCallback)(function () {
if (offset > 0) {
if (leftWidth && offset > THRESHOLD.left * leftWidth) {
open('left');
} else {
swipeMove(0);
}
}
if (offset < 0) {
if (rightWidth && -offset > THRESHOLD.right * rightWidth) {
open('right');
} else {
swipeMove(0);
}
}
}, [THRESHOLD.left, THRESHOLD.right, leftWidth, offset, open, rightWidth, swipeMove]);
var onClick_ = (0, _react.useCallback)(function (event) {
event.stopPropagation();
event.preventDefault();
var _event$currentTarget$ = event.currentTarget.dataset.key,
position = _event$currentTarget$ === void 0 ? 'outside' : _event$currentTarget$;
Object.defineProperty(event, 'detail', {
value: {
position: position,
name: name,
instance: {
close: close,
open: open
}
}
});
if (onClick) onClick(event);
if (asyncClose && onClose) {
onClose(event);
} else if (onClose) {
onClose(event);
swipeMove(0);
} else {
swipeMove(0);
}
}, // eslint-disable-next-line react-hooks/exhaustive-deps
[asyncClose, onClick, onClose, swipeMove]);
var startDrag = (0, _react.useCallback)(function (event) {
if (disabled) return;
setStartOffset(offset);
touchStart(event);
}, [disabled, offset, touchStart]);
var onDrag = (0, _react.useCallback)(function (event) {
if (disabled) return;
event.preventDefault();
var touchState = touchMove(event);
if (!touchState.direction || touchState.direction === 'vertical') {
return;
}
ARRAY.filter(function (item) {
return item.key !== instanceKey.key;
}).forEach(function (item) {
return item.close(true);
});
swipeMove(startOffset + touchState.deltaX, true);
}, [disabled, instanceKey.key, startOffset, swipeMove, touchMove]);
var endDrag = (0, _react.useCallback)(function () {
if (disabled) return;
swipeLeaveTransition();
(0, _taro.nextTick)(function () {
resetTouchStatus();
});
}, [disabled, resetTouchStatus, swipeLeaveTransition]);
(0, _react.useImperativeHandle)(ref, function () {
return {
close: close,
open: open
};
});
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.View, _objectSpread(_objectSpread({
className: "van-swipe-cell ".concat(className),
"data-key": "cell",
style: utils.style([style]) // onClick={onClick_}
,
onTouchStart: startDrag,
onTouchMove: onDrag,
onTouchEnd: endDrag,
onTouchCancel: endDrag
}, others), {}, {
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_components.View, {
style: wrapperStyle,
children: [leftWidth ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.View, {
className: "van-swipe-cell__left",
"data-key": "left",
onClick: onClick_,
style: {
width: leftWidth + 'px'
},
children: renderLeft
}) : '', children, rightWidth ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.View, {
className: "van-swipe-cell__right",
"data-key": "right",
onClick: onClick_,
style: {
width: rightWidth + 'px'
},
children: renderRight
}) : '']
})
}));
}
var SwipeCell = /*#__PURE__*/(0, _react.forwardRef)(Index);
exports.SwipeCell = SwipeCell;
var _default = SwipeCell;
exports.default = _default;