@georstat/react-native-image-gallery
Version:
React Native Image Gallery with Thumbnails
123 lines (108 loc) • 3.57 kB
JavaScript
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
import React, { useRef } from 'react';
import { Animated, PanResponder, View } from 'react-native';
import { getDistance, getScale } from './_helpers';
const PanContainer = _ref => {
let {
children,
close,
setIsDragging
} = _ref;
const translationXY = useRef(new Animated.ValueXY()).current;
const scale = useRef(new Animated.Value(1)).current;
let _initialTouches = useRef().current;
const onRelease = (_, gestureState) => {
setIsDragging(false);
if (gestureState.dy > 180 && _initialTouches.length === 1) {
close();
return false;
}
Animated.parallel([Animated.timing(scale, {
duration: 100,
toValue: 1,
useNativeDriver: true
}), Animated.timing(translationXY.x, {
duration: 100,
toValue: 0,
useNativeDriver: true
}), Animated.timing(translationXY.y, {
duration: 100,
toValue: 0,
useNativeDriver: true
})]).start();
};
const panResponder = React.useRef(PanResponder.create({
onStartShouldSetPanResponder: () => true,
onMoveShouldSetPanResponder: (_, gestureState) => {
const absDx = Math.abs(gestureState.dx);
const absDY = Math.abs(gestureState.dy);
if (absDY > 5 && absDx <= 2 && gestureState.numberActiveTouches <= 1) {
return true;
}
if (absDx > 0 && gestureState.numberActiveTouches <= 1) {
return false;
}
return true;
},
// onMoveShouldSetPanResponderCapture: (evt, gestureState) => true,
onPanResponderGrant: evt => {
setIsDragging(true);
_initialTouches = evt.nativeEvent.touches;
translationXY.setOffset({
x: 0,
y: 0
});
return true;
},
onPanResponderMove: (evt, gestureState) => {
const {
touches
} = evt.nativeEvent;
if (touches.length <= 1 && Math.abs(gestureState.dy) > 10) {
translationXY.y.setValue(gestureState.dy);
return true;
}
if (touches.length <= 1 && Math.abs(gestureState.dx) > 0) {
setIsDragging(false);
return false;
}
if (touches.length < 2) {
// Trigger a release
onRelease(evt, gestureState);
return false;
}
const {
dx,
dy
} = gestureState;
translationXY.x.setValue(dx);
translationXY.y.setValue(dy); // for scaling photo
const currentDistance = getDistance(touches);
const initialDistance = getDistance(_initialTouches);
const newScale = getScale(currentDistance, initialDistance);
scale.setValue(newScale);
return true;
},
onPanResponderTerminationRequest: () => {
return true;
},
onPanResponderRelease: (evt, gestureState) => {
onRelease(evt, gestureState);
return true;
},
onPanResponderTerminate: () => true
})).current;
return /*#__PURE__*/React.createElement(View, null, /*#__PURE__*/React.createElement(Animated.View, _extends({}, panResponder.panHandlers, {
style: {
transform: [{
translateX: translationXY.x
}, {
translateY: translationXY.y
}, {
scale: scale
}]
}
}), children));
};
export default PanContainer;
//# sourceMappingURL=PanContainer.js.map