react-native-walkthrough-swiper
Version:
A walkthrough swiper component for React-Native. Can be used in onboarding/walkthrough screens. Uses Reanimated API to create smooth animations.
111 lines • 3.85 kB
JavaScript
function _extends() { _extends = Object.assign ? Object.assign.bind() : 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 { PanResponder, View } from 'react-native';
// react-native-walkthrough-swiper
// This adds walkthrough pages with configurable animation effects
export const swipeDirections = {
SWIPE_UP: 'SWIPE_UP',
SWIPE_DOWN: 'SWIPE_DOWN',
SWIPE_LEFT: 'SWIPE_LEFT',
SWIPE_RIGHT: 'SWIPE_RIGHT'
};
const swipeConfig = {
velocityThreshold: 0.3,
directionalOffsetThreshold: 80,
gestureIsClickThreshold: 5
};
function isValidSwipe(velocity, velocityThreshold, directionalOffset, directionalOffsetThreshold) {
return Math.abs(velocity) > velocityThreshold && Math.abs(directionalOffset) < directionalOffsetThreshold;
}
const GestureRecognizer = props => {
const swipeConfigRef = useRef(Object.assign({}, swipeConfig, props.config));
const shouldSetPanResponder = (evt, gestureState) => {
return evt.nativeEvent.touches.length === 1 && !_gestureIsClick(gestureState);
};
const _gestureIsClick = gestureState => {
return Math.abs(gestureState.dx) < swipeConfigRef.current.gestureIsClickThreshold && Math.abs(gestureState.dy) < swipeConfigRef.current.gestureIsClickThreshold;
};
const handlePanResponderEnd = (evt, gestureState) => {
const swipeDirection = _getSwipeDirection(gestureState);
_triggerSwipeHandlers(swipeDirection, gestureState);
};
const _triggerSwipeHandlers = (swipeDirection, gestureState) => {
const {
onSwipe,
onSwipeUp,
onSwipeDown,
onSwipeLeft,
onSwipeRight
} = props;
const {
SWIPE_LEFT,
SWIPE_RIGHT,
SWIPE_UP,
SWIPE_DOWN
} = swipeDirections;
onSwipe && onSwipe(swipeDirection, gestureState);
switch (swipeDirection) {
case SWIPE_LEFT:
onSwipeLeft && onSwipeLeft(gestureState);
break;
case SWIPE_RIGHT:
onSwipeRight && onSwipeRight(gestureState);
break;
case SWIPE_UP:
onSwipeUp && onSwipeUp(gestureState);
break;
case SWIPE_DOWN:
onSwipeDown && onSwipeDown(gestureState);
break;
}
};
const _getSwipeDirection = gestureState => {
const {
SWIPE_LEFT,
SWIPE_RIGHT,
SWIPE_UP,
SWIPE_DOWN
} = swipeDirections;
const {
dx,
dy
} = gestureState;
if (_isValidHorizontalSwipe(gestureState)) {
return dx > 0 ? SWIPE_RIGHT : SWIPE_LEFT;
} else if (_isValidVerticalSwipe(gestureState)) {
return dy > 0 ? SWIPE_DOWN : SWIPE_UP;
}
return null;
};
const _isValidHorizontalSwipe = gestureState => {
const {
vx,
dy
} = gestureState;
const {
velocityThreshold,
directionalOffsetThreshold
} = swipeConfigRef.current;
return isValidSwipe(vx, velocityThreshold, dy, directionalOffsetThreshold);
};
const _isValidVerticalSwipe = gestureState => {
const {
vy,
dx
} = gestureState;
const {
velocityThreshold,
directionalOffsetThreshold
} = swipeConfigRef.current;
return isValidSwipe(vy, velocityThreshold, dx, directionalOffsetThreshold);
};
const panResponder = PanResponder.create({
onStartShouldSetPanResponder: shouldSetPanResponder,
onMoveShouldSetPanResponder: shouldSetPanResponder,
onPanResponderRelease: handlePanResponderEnd,
onPanResponderTerminate: handlePanResponderEnd
});
return /*#__PURE__*/React.createElement(View, _extends({}, props, panResponder.panHandlers));
};
export default GestureRecognizer;
//# sourceMappingURL=SwipeRecogniser.js.map