react-native-sortables
Version:
Powerful Sortable Components for Flexible Content Reordering in React Native
67 lines (66 loc) • 2.13 kB
JavaScript
;
import React from "react";
import { useMemo } from 'react';
import { View } from 'react-native';
import { Gesture, GestureDetector } from 'react-native-gesture-handler';
import { useItemContext } from '../../providers';
import { jsx as _jsx } from "react/jsx-runtime";
export default function SortableTouchable({
children,
failDistance = 10,
gestureMode = 'exclusive',
onDoubleTap,
onLongPress,
onTap,
onTouchesDown,
onTouchesUp,
...viewProps
}) {
const {
gesture: externalGesture
} = useItemContext();
const gesture = useMemo(() => {
const decorate = decoratedGesture => {
decoratedGesture.simultaneousWithExternalGesture(externalGesture).runOnJS(true);
if ('maxDistance' in decoratedGesture) {
decoratedGesture.maxDistance(failDistance);
}
return decoratedGesture;
};
const gestures = [];
if (onTap) {
gestures.push(decorate(Gesture.Tap()).onStart(onTap));
}
if (onDoubleTap) {
gestures.push(decorate(Gesture.Tap()).numberOfTaps(2).onStart(onDoubleTap));
}
if (onLongPress) {
gestures.push(decorate(Gesture.LongPress()).onStart(onLongPress));
}
if (onTouchesDown || onTouchesUp) {
// Reuse already added gesture if possible or create a manual gesture
// if there is no other gesture yet
if (!gestures.length) {
gestures.push(decorate(Gesture.Manual()));
}
const lastGesture = gestures[gestures.length - 1];
if (onTouchesDown) {
lastGesture.onTouchesDown(onTouchesDown);
}
if (onTouchesUp) {
lastGesture.onTouchesUp(onTouchesUp);
}
}
return gestureMode === 'exclusive' ? Gesture.Exclusive(...gestures) : Gesture.Simultaneous(...gestures);
}, [failDistance, onTap, onDoubleTap, onLongPress, onTouchesDown, onTouchesUp, externalGesture, gestureMode]);
return /*#__PURE__*/_jsx(GestureDetector, {
gesture: gesture,
userSelect: "none",
children: /*#__PURE__*/_jsx(View, {
...viewProps,
collapsable: false,
children: children
})
});
}
//# sourceMappingURL=SortableTouchable.js.map