import PropTypes from 'prop-types'; import React from 'react'; import createHandler from './createHandler'; import GestureHandlerPropTypes from './GestureHandlerPropTypes'; import PlatformConstants from './PlatformConstants'; export const TapGestureHandler = createHandler( 'TapGestureHandler', { ...GestureHandlerPropTypes, maxDurationMs: PropTypes.number, maxDelayMs: PropTypes.number, numberOfTaps: PropTypes.number, maxDeltaX: PropTypes.number, maxDeltaY: PropTypes.number, maxDist: PropTypes.number, minPointers: PropTypes.number, }, {} ); export const FlingGestureHandler = createHandler( 'FlingGestureHandler', { ...GestureHandlerPropTypes, numberOfPointers: PropTypes.number, direction: PropTypes.number, }, {} ); class ForceTouchFallback extends React.Component { componentDidMount() { console.warn( 'ForceTouchGestureHandler is not available on this platform. Please use ForceTouchGestureHandler.forceTouchAvailable to conditionally render other components that would provide a fallback behavior specific to your usecase' ); } render() { return this.props.children; } } export const ForceTouchGestureHandler = PlatformConstants && PlatformConstants.forceTouchAvailable ? createHandler( 'ForceTouchGestureHandler', { ...GestureHandlerPropTypes, minForce: PropTypes.number, maxForce: PropTypes.number, feedbackOnActivation: PropTypes.bool, }, {} ) : ForceTouchFallback; ForceTouchGestureHandler.forceTouchAvailable = (PlatformConstants && PlatformConstants.forceTouchAvailable) || false; export const LongPressGestureHandler = createHandler( 'LongPressGestureHandler', { ...GestureHandlerPropTypes, minDurationMs: PropTypes.number, maxDist: PropTypes.number, }, {} ); function validatePanGestureHandlerProps(props) { if (props.minDeltaX && props.activeOffsetX) { throw new Error( `It's not supported use minDeltaX with activeOffsetXStart or activeOffsetXEnd` ); } if (props.maxDeltaX && props.failOffsetX) { throw new Error( `It's not supported use minDeltaX with activeOffsetXStart or activeOffsetXEnd` ); } if (props.minDeltaY && props.activeOffsetY) { throw new Error( `It's not supported use minDeltaX with activeOffsetYStart or activeOffsetYEnd` ); } if (props.maxDeltaY && props.failOffsetY) { throw new Error( `It's not supported use minDeltaX with activeOffsetYStart or activeOffsetYEnd` ); } if ( Array.isArray(props.activeOffsetX) && (props.activeOffsetX[0] > 0 || props.activeOffsetX[1] < 0) ) { throw new Error( `First element of activeOffsetX should be negative, a the second one should be positive` ); } if ( Array.isArray(props.activeOffsetY) && (props.activeOffsetY[0] > 0 || props.activeOffsetY[1] < 0) ) { throw new Error( `First element of activeOffsetY should be negative, a the second one should be positive` ); } if ( Array.isArray(props.failOffsetX) && (props.failOffsetX[0] > 0 || props.failOffsetX[1] < 0) ) { throw new Error( `First element of failOffsetX should be negative, a the second one should be positive` ); } if ( Array.isArray(props.failOffsetY) && (props.failOffsetY[0] > 0 || props.failOffsetY[1] < 0) ) { throw new Error( `First element of failOffsetY should be negative, a the second one should be positive` ); } } function transformPanGestureHandlerProps(props) { const res = { ...props }; if (props.minDeltaX !== undefined) { delete res['minDeltaX']; res.activeOffsetXStart = -props.minDeltaX; res.activeOffsetXEnd = props.minDeltaX; } if (props.maxDeltaX !== undefined) { delete res['maxDeltaX']; res.failOffsetXStart = -props.maxDeltaX; res.failOffsetXEnd = props.maxDeltaX; } if (props.minOffsetX !== undefined) { delete res['minOffsetX']; if (props.minOffsetX < 0) { res.activeOffsetXStart = props.minOffsetX; } else { res.activeOffsetXEnd = props.minOffsetX; } } if (props.minDeltaY !== undefined) { delete res['minDeltaY']; res.activeOffsetYStart = -props.minDeltaY; res.activeOffsetYEnd = props.minDeltaY; } if (props.maxDeltaY !== undefined) { delete res['maxDeltaY']; res.failOffsetYStart = -props.maxDeltaY; res.failOffsetYEnd = props.maxDeltaY; } if (props.minOffsetY !== undefined) { delete res['minOffsetY']; if (props.minOffsetY < 0) { res.activeOffsetYStart = props.minOffsetY; } else { res.activeOffsetYEnd = props.minOffsetY; } } if (props.activeOffsetX !== undefined) { delete res['activeOffsetX']; if (Array.isArray(props.activeOffsetX)) { res.activeOffsetXStart = props.activeOffsetX[0]; res.activeOffsetXEnd = props.activeOffsetX[1]; } else if (props.activeOffsetX < 0) { res.activeOffsetXStart = props.activeOffsetX; } else { res.activeOffsetXEnd = props.activeOffsetX; } } if (props.activeOffsetY !== undefined) { delete res['activeOffsetY']; if (Array.isArray(props.activeOffsetY)) { res.activeOffsetYStart = props.activeOffsetY[0]; res.activeOffsetYEnd = props.activeOffsetY[1]; } else if (props.activeOffsetY < 0) { res.activeOffsetYStart = props.activeOffsetY; } else { res.activeOffsetYEnd = props.activeOffsetY; } } if (props.failOffsetX !== undefined) { delete res['failOffsetX']; if (Array.isArray(props.failOffsetX)) { res.failOffsetXStart = props.failOffsetX[0]; res.failOffsetXEnd = props.failOffsetX[1]; } else if (props.failOffsetX < 0) { res.failOffsetXStart = props.failOffsetX; } else { res.failOffsetXEnd = props.failOffsetX; } } if (props.failOffsetY !== undefined) { delete res['failOffsetY']; if (Array.isArray(props.failOffsetY)) { res.failOffsetYStart = props.failOffsetY[0]; res.failOffsetYEnd = props.failOffsetY[1]; } else if (props.failOffsetY < 0) { res.failOffsetYStart = props.failOffsetY; } else { res.failOffsetYEnd = props.failOffsetY; } } return res; } function managePanProps(props) { if (__DEV__) { validatePanGestureHandlerProps(props); } return transformPanGestureHandlerProps(props); } export const PanGestureHandler = createHandler( 'PanGestureHandler', { ...GestureHandlerPropTypes, activeOffsetY: PropTypes.oneOfType([ PropTypes.number, PropTypes.arrayOf(PropTypes.number), ]), activeOffsetX: PropTypes.oneOfType([ PropTypes.number, PropTypes.arrayOf(PropTypes.number), ]), failOffsetY: PropTypes.oneOfType([ PropTypes.number, PropTypes.arrayOf(PropTypes.number), ]), failOffsetX: PropTypes.oneOfType([ PropTypes.number, PropTypes.arrayOf(PropTypes.number), ]), minDist: PropTypes.number, minVelocity: PropTypes.number, minVelocityX: PropTypes.number, minVelocityY: PropTypes.number, minPointers: PropTypes.number, maxPointers: PropTypes.number, avgTouches: PropTypes.bool, }, {}, managePanProps, { activeOffsetYStart: true, activeOffsetYEnd: true, activeOffsetXStart: true, activeOffsetXEnd: true, failOffsetYStart: true, failOffsetYEnd: true, failOffsetXStart: true, failOffsetXEnd: true, } ); export const PinchGestureHandler = createHandler( 'PinchGestureHandler', GestureHandlerPropTypes, {} ); export const RotationGestureHandler = createHandler( 'RotationGestureHandler', GestureHandlerPropTypes, {} );