UNPKG

rs-react-native-image-gallery

Version:
104 lines 15.3 kB
import React, { useRef, useCallback, useMemo } from 'react'; import { Animated, PanResponder, View } from 'react-native'; import { getDistance, getScale } from './_helpers'; var PanContainer = function (_a) { var children = _a.children, close = _a.close, setIsDragging = _a.setIsDragging; var translationXY = useRef(new Animated.ValueXY()).current; var scale = useRef(new Animated.Value(1)).current; var _initialTouches = useRef([]).current; var onRelease = useCallback(function (_, gestureState) { setIsDragging(false); if (gestureState.dy > 180 && _initialTouches.length === 1) { close(); return false; } // Reset with animation 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(); }, [close, scale, translationXY.x, translationXY.y, setIsDragging, _initialTouches.length]); // Create panResponder with memoization var panResponder = useMemo(function () { return PanResponder.create({ onStartShouldSetPanResponder: function () { return true; }, onMoveShouldSetPanResponder: function (_, gestureState) { var dx = gestureState.dx, dy = gestureState.dy, numberActiveTouches = gestureState.numberActiveTouches; var absDx = Math.abs(dx); var absDY = Math.abs(dy); // Improved gesture recognition logic if (absDY > 5 && absDx <= 2 && numberActiveTouches <= 1) { return true; } if (absDx > 0 && numberActiveTouches <= 1) { return false; } return true; }, onPanResponderGrant: function (evt) { setIsDragging(true); _initialTouches = evt.nativeEvent.touches; translationXY.setOffset({ x: 0, y: 0 }); return true; }, onPanResponderMove: function (evt, gestureState) { var touches = evt.nativeEvent.touches; var dx = gestureState.dx, dy = gestureState.dy; if (touches.length <= 1) { // Handle vertical swipe to close if (Math.abs(dy) > 10) { translationXY.y.setValue(dy); return true; } // Handle horizontal swipe if (Math.abs(dx) > 0) { setIsDragging(false); return false; } // Not enough touches for pinch-zoom if (touches.length < 2) { onRelease(evt, gestureState); return false; } } // Handle pinch zoom and pan translationXY.x.setValue(dx); translationXY.y.setValue(dy); // Calculate scale for zooming var currentDistance = getDistance(touches); var initialDistance = getDistance(_initialTouches); if (currentDistance && initialDistance) { var newScale = getScale(currentDistance, initialDistance); scale.setValue(newScale); } return true; }, onPanResponderRelease: onRelease, onPanResponderTerminate: function () { return true; }, onPanResponderTerminationRequest: function () { return true; } }); }, [onRelease, setIsDragging, translationXY, scale]); return (<View style={{ flex: 1 }}> <Animated.View {...panResponder.panHandlers} style={{ flex: 1, transform: [{ translateX: translationXY.x }, { translateY: translationXY.y }, { scale: scale }] }}> {children} </Animated.View> </View>); }; export default React.memo(PanContainer); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFuLWNvbnRhaW5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wYW4tY29udGFpbmVyLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxFQUFhLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxRQUFRLEVBQXlCLFlBQVksRUFBNEIsSUFBSSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdHLE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRW5ELElBQU0sWUFBWSxHQUFHLFVBQUMsRUFRckI7UUFQQSxRQUFRLGNBQUEsRUFDUixLQUFLLFdBQUEsRUFDTCxhQUFhLG1CQUFBO0lBTWIsSUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQzdELElBQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDcEQsSUFBSSxlQUFlLEdBQUcsTUFBTSxDQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUU5QyxJQUFNLFNBQVMsR0FBRyxXQUFXLENBQzVCLFVBQUMsQ0FBd0IsRUFBRSxZQUFzQztRQUNoRSxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckIsSUFBSSxZQUFZLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxlQUFlLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzNELEtBQUssRUFBRSxDQUFDO1lBQ1IsT0FBTyxLQUFLLENBQUM7UUFDZCxDQUFDO1FBRUQsdUJBQXVCO1FBQ3ZCLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDakIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7Z0JBQ3RCLFFBQVEsRUFBRSxH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QUFDO1lBQ1AsU0FBUyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssT0FBQSxFQUFFLENBQUM7U0FDeEYsQ0FBQyxDQUNGO0lBQUEsQ0FBQyxRQUFRLENBQ1Y7R0FBQSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQ2hCO0VBQUEsRUFBRSxJQUFJLENBQUMsQ0FDUCxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsZUFBZSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IFJlYWN0Tm9kZSwgdXNlUmVmLCB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEFuaW1hdGVkLCBHZXN0dXJlUmVzcG9uZGVyRXZlbnQsIFBhblJlc3BvbmRlciwgUGFuUmVzcG9uZGVyR2VzdHVyZVN0YXRlLCBWaWV3IH0gZnJvbSAncmVhY3QtbmF0aXZlJztcbmltcG9ydCB7IGdldERpc3RhbmNlLCBnZXRTY2FsZSB9IGZyb20gJy4vX2hlbHBlcnMnO1xuXG5jb25zdCBQYW5Db250YWluZXIgPSAoe1xuXHRjaGlsZHJlbixcblx0Y2xvc2UsXG5cdHNldElzRHJhZ2dpbmdcbn06IHtcblx0Y2hpbGRyZW46IFJlYWN0Tm9kZTtcblx0Y2xvc2U6ICgpID0+IHZvaWQ7XG5cdHNldElzRHJhZ2dpbmc6IChpc0RyYWdnaW5nOiBib29sZWFuKSA9PiB2b2lkO1xufSkgPT4ge1xuXHRjb25zdCB0cmFuc2xhdGlvblhZID0gdXNlUmVmKG5ldyBBbmltYXRlZC5WYWx1ZVhZKCkpLmN1cnJlbnQ7XG5cdGNvbnN0IHNjYWxlID0gdXNlUmVmKG5ldyBBbmltYXRlZC5WYWx1ZSgxKSkuY3VycmVudDtcblx0bGV0IF9pbml0aWFsVG91Y2hlcyA9IHVzZVJlZjxhbnk+KFtdKS5jdXJyZW50O1xuXG5cdGNvbnN0IG9uUmVsZWFzZSA9IHVzZUNhbGxiYWNrKFxuXHRcdChfOiBHZXN0dXJlUmVzcG9uZGVyRXZlbnQsIGdlc3R1cmVTdGF0ZTogUGFuUmVzcG9uZGVyR2VzdHVyZVN0YXRlKTogdm9pZCB8IGJvb2xlYW4gPT4ge1xuXHRcdFx0c2V0SXNEcmFnZ2luZyhmYWxzZSk7XG5cblx0XHRcdGlmIChnZXN0dXJlU3RhdGUuZHkgPiAxODAgJiYgX2luaXRpYWxUb3VjaGVzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRjbG9zZSgpO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlc2V0IHdpdGggYW5pbWF0aW9uXG5cdFx0XHRBbmltYXRlZC5wYXJhbGxlbChbXG5cdFx0XHRcdEFuaW1hdGVkLnRpbWluZyhzY2FsZSwge1xuXHRcdFx0XHRcdGR1cmF0aW9uOiAxMDAsXG5cdFx0XHRcdFx0dG9WYWx1ZTogMSxcblx0XHRcdFx0XHR1c2VOYXRpdmVEcml2ZXI6IHRydWVcblx0XHRcdFx0fSksXG5cdFx0XHRcdEFuaW1hdGVkLnRpbWluZyh0cmFuc2xhdGlvblhZLngsIHtcblx0XHRcdFx0XHRkdXJhdGlvbjogMTAwLFxuXHRcdFx0XHRcdHRvVmFsdWU6IDAsXG5cdFx0XHRcdFx0dXNlTmF0aXZlRHJpdmVyOiB0cnVlXG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRBbmltYXRlZC50aW1pbmcodHJhbnNsYXRpb25YWS55LCB7XG5cdFx0XHRcdFx0ZHVyYXRpb246IDEwMCxcblx0XHRcdFx0XHR0b1ZhbHVlOiAwLFxuXHRcdFx0XHRcdHVzZU5hdGl2ZURyaXZlcjogdHJ1ZVxuXHRcdFx0XHR9KVxuXHRcdFx0XSkuc3RhcnQoKTtcblx0XHR9LFxuXHRcdFtjbG9zZSwgc2NhbGUsIHRyYW5zbGF0aW9uWFkueCwgdHJhbnNsYXRpb25YWS55LCBzZXRJc0RyYWdnaW5nLCBfaW5pdGlhbFRvdWNoZXMubGVuZ3RoXVxuXHQpO1xuXG5cdC8vIENyZWF0ZSBwYW5SZXNwb25kZXIgd2l0aCBtZW1vaXphdGlvblxuXHRjb25zdCBwYW5SZXNwb25kZXIgPSB1c2VNZW1vKFxuXHRcdCgpID0+XG5cdFx0XHRQYW5SZXNwb25kZXIuY3JlYXRlKHtcblx0XHRcdFx0b25TdGFydFNob3VsZFNldFBhblJlc3BvbmRlcjogKCkgPT4gdHJ1ZSxcblx0XHRcdFx0b25Nb3ZlU2hvdWxkU2V0UGFuUmVzcG9uZGVyOiAoXzogR2VzdHVyZVJlc3BvbmRlckV2ZW50LCBnZXN0dXJlU3RhdGU6IFBhblJlc3BvbmRlckdlc3R1cmVTdGF0ZSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHsgZHgsIGR5LCBudW1iZXJBY3RpdmVUb3VjaGVzIH0gPSBnZXN0dXJlU3RhdGU7XG5cdFx0XHRcdFx0Y29uc3QgYWJzRHggPSBNYXRoLmFicyhkeCk7XG5cdFx0XHRcdFx0Y29uc3QgYWJzRFkgPSBNYXRoLmFicyhkeSk7XG5cblx0XHRcdFx0XHQvLyBJbXByb3ZlZCBnZXN0dXJlIHJlY29nbml0aW9uIGxvZ2ljXG5cdFx0XHRcdFx0aWYgKGFic0RZID4gNSAmJiBhYnNEeCA8PSAyICYmIG51bWJlckFjdGl2ZVRvdWNoZXMgPD0gMSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChhYnNEeCA+IDAgJiYgbnVtYmVyQWN0aXZlVG91Y2hlcyA8PSAxKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRvblBhblJlc3BvbmRlckdyYW50OiAoZXZ0OiBHZXN0dXJlUmVzcG9uZGVyRXZlbnQpID0+IHtcblx0XHRcdFx0XHRzZXRJc0RyYWdnaW5nKHRydWUpO1xuXHRcdFx0XHRcdF9pbml0aWFsVG91Y2hlcyA9IGV2dC5uYXRpdmVFdmVudC50b3VjaGVzO1xuXHRcdFx0XHRcdHRyYW5zbGF0aW9uWFkuc2V0T2Zmc2V0KHsgeDogMCwgeTogMCB9KTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fSxcblx0XHRcdFx0b25QYW5SZXNwb25kZXJNb3ZlOiAoZXZ0OiBHZXN0dXJlUmVzcG9uZGVyRXZlbnQsIGdlc3R1cmVTdGF0ZTogUGFuUmVzcG9uZGVyR2VzdHVyZVN0YXRlKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgeyB0b3VjaGVzIH0gPSBldnQubmF0aXZlRXZlbnQ7XG5cdFx0XHRcdFx0Y29uc3QgeyBkeCwgZHkgfSA9IGdlc3R1cmVTdGF0ZTtcblxuXHRcdFx0XHRcdGlmICh0b3VjaGVzLmxlbmd0aCA8PSAxKSB7XG5cdFx0XHRcdFx0XHQvLyBIYW5kbGUgdmVydGljYWwgc3dpcGUgdG8gY2xvc2Vcblx0XHRcdFx0XHRcdGlmIChNYXRoLmFicyhkeSkgPiAxMCkge1xuXHRcdFx0XHRcdFx0XHR0cmFuc2xhdGlvblhZLnkuc2V0VmFsdWUoZHkpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGhvcml6b250YWwgc3dpcGVcblx0XHRcdFx0XHRcdGlmIChNYXRoLmFicyhkeCkgPiAwKSB7XG5cdFx0XHRcdFx0XHRcdHNldElzRHJhZ2dpbmcoZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIE5vdCBlbm91Z2ggdG91Y2hlcyBmb3IgcGluY2gtem9vbVxuXHRcdFx0XHRcdFx0aWYgKHRvdWNoZXMubGVuZ3RoIDwgMikge1xuXHRcdFx0XHRcdFx0XHRvblJlbGVhc2UoZXZ0LCBnZXN0dXJlU3RhdGUpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gSGFuZGxlIHBpbmNoIHpvb20gYW5kIHBhblxuXHRcdFx0XHRcdHRyYW5zbGF0aW9uWFkueC5zZXRWYWx1ZShkeCk7XG5cdFx0XHRcdFx0dHJhbnNsYXRpb25YWS55LnNldFZhbHVlKGR5KTtcblxuXHRcdFx0XHRcdC8vIENhbGN1bGF0ZSBzY2FsZSBmb3Igem9vbWluZ1xuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnREaXN0YW5jZSA9IGdldERpc3RhbmNlKHRvdWNoZXMpO1xuXHRcdFx0XHRcdGNvbnN0IGluaXRpYWxEaXN0YW5jZSA9IGdldERpc3RhbmNlKF9pbml0aWFsVG91Y2hlcyk7XG5cdFx0XHRcdFx0aWYgKGN1cnJlbnREaXN0YW5jZSAmJiBpbml0aWFsRGlzdGFuY2UpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG5ld1NjYWxlID0gZ2V0U2NhbGUoY3VycmVudERpc3RhbmNlLCBpbml0aWFsRGlzdGFuY2UpO1xuXHRcdFx0XHRcdFx0c2NhbGUuc2V0VmFsdWUobmV3U2NhbGUpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRvblBhblJlc3BvbmRlclJlbGVhc2U6IG9uUmVsZWFzZSxcblx0XHRcdFx0b25QYW5SZXNwb25kZXJUZXJtaW5hdGU6ICgpID0+IHRydWUsXG5cdFx0XHRcdG9uUGFuUmVzcG9uZGVyVGVybWluYXRpb25SZXF1ZXN0OiAoKSA9PiB0cnVlXG5cdFx0XHR9KSxcblx0XHRbb25SZWxlYXNlLCBzZXRJc0RyYWdnaW5nLCB0cmFuc2xhdGlvblhZLCBzY2FsZV1cblx0KTtcblxuXHRyZXR1cm4gKFxuXHRcdDxWaWV3IHN0eWxlPXt7IGZsZXg6IDEgfX0+XG5cdFx0XHQ8QW5pbWF0ZWQuVmlld1xuXHRcdFx0XHR7Li4ucGFuUmVzcG9uZGVyLnBhbkhhbmRsZXJzfVxuXHRcdFx0XHRzdHlsZT17e1xuXHRcdFx0XHRcdGZsZXg6IDEsXG5cdFx0XHRcdFx0dHJhbnNmb3JtOiBbeyB0cmFuc2xhdGVYOiB0cmFuc2xhdGlvblhZLnggfSwgeyB0cmFuc2xhdGVZOiB0cmFuc2xhdGlvblhZLnkgfSwgeyBzY2FsZSB9XVxuXHRcdFx0XHR9fT5cblx0XHRcdFx0e2NoaWxkcmVufVxuXHRcdFx0PC9BbmltYXRlZC5WaWV3PlxuXHRcdDwvVmlldz5cblx0KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJlYWN0Lm1lbW8oUGFuQ29udGFpbmVyKTtcbiJdfQ==