diff --git a/src/index.ts b/src/index.ts index 52c86ac5..af86b6b6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -37,6 +37,7 @@ export { const defaultProps = { delta: 10, preventDefaultTouchmoveEvent: false, + preventMixDirections: false, rotationAngle: 0, trackMouse: false, trackTouch: true, @@ -47,6 +48,7 @@ const initialState: SwipeableState = { start: 0, swiping: false, xy: [0, 0], + initialDirection: null, }; const mouseMove = "mousemove"; const mouseUp = "mouseup"; @@ -108,6 +110,7 @@ function getHandlers( ...state, ...initialState, initial: [...xy], + initialDirection: null, xy, start: event.timeStamp || 0, }; @@ -140,7 +143,12 @@ function getHandlers( ? props.delta : props.delta[dir.toLowerCase() as Lowercase] || defaultProps.delta; - if (absX < delta && absY < delta && !state.swiping) return state; + if (absX < delta && absY < delta && !state.swiping) + return { ...state, initialDirection: state.initialDirection || dir }; + + if (props.preventMixDirections && dir !== state.initialDirection) { + return state; + } const eventData = { absX, diff --git a/src/types.ts b/src/types.ts index 638eaefe..4f6ea29a 100644 --- a/src/types.ts +++ b/src/types.ts @@ -46,6 +46,7 @@ export type ConfigurationOptionDelta = export interface ConfigurationOptions { delta: ConfigurationOptionDelta; preventDefaultTouchmoveEvent: boolean; + preventMixDirections: boolean; rotationAngle: number; trackMouse: boolean; trackTouch: boolean; @@ -70,6 +71,7 @@ export type SwipeableState = { start: number; swiping: boolean; xy: Vector2; + initialDirection: null | SwipeDirections; }; export type StateSetter = (