This repository has been archived on 2022-03-12. You can view files and clone it, but cannot push or open issues or pull requests.
2021-04-02 02:24:13 +03:00

279 lines
7.5 KiB
JavaScript

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,
{}
);