react-native-gesture-handler 2.16.0-rc.0 → 2.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (196) hide show
  1. package/android/noreanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt +2 -0
  2. package/android/paper/src/main/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerDelegate.java +9 -0
  3. package/android/paper/src/main/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerInterface.java +3 -0
  4. package/android/src/main/java/com/swmansion/gesturehandler/RNGestureHandlerPackage.kt +2 -2
  5. package/android/src/main/java/com/swmansion/gesturehandler/core/DiagonalDirections.kt +8 -0
  6. package/android/src/main/java/com/swmansion/gesturehandler/core/FlingGestureHandler.kt +61 -24
  7. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt +17 -22
  8. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +30 -11
  9. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureUtils.kt +3 -0
  10. package/android/src/main/java/com/swmansion/gesturehandler/core/Vector.kt +66 -0
  11. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +119 -19
  12. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.kt +2 -2
  13. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.kt +1 -4
  14. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +4 -2
  15. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt +1 -1
  16. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.kt +1 -4
  17. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerTouchEvent.kt +4 -7
  18. package/apple/Handlers/RNLongPressHandler.m +5 -13
  19. package/apple/Handlers/RNPinchHandler.m +12 -1
  20. package/apple/RNGestureHandler.m +3 -1
  21. package/lib/commonjs/Directions.js +19 -6
  22. package/lib/commonjs/Directions.js.map +1 -1
  23. package/lib/commonjs/RNGestureHandlerModule.web.js +7 -61
  24. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  25. package/lib/commonjs/components/DrawerLayout.js.map +1 -1
  26. package/lib/commonjs/components/Swipeable.js +3 -1
  27. package/lib/commonjs/components/Swipeable.js.map +1 -1
  28. package/lib/commonjs/components/touchables/GenericTouchable.js +1 -0
  29. package/lib/commonjs/components/touchables/GenericTouchable.js.map +1 -1
  30. package/lib/commonjs/handlers/createHandler.js +2 -2
  31. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  32. package/lib/commonjs/handlers/customDirectEventTypes.js +14 -0
  33. package/lib/commonjs/handlers/customDirectEventTypes.js.map +1 -0
  34. package/lib/commonjs/handlers/customDirectEventTypes.web.js +11 -0
  35. package/lib/commonjs/handlers/customDirectEventTypes.web.js.map +1 -0
  36. package/lib/commonjs/handlers/gestureHandlerCommon.js +13 -2
  37. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
  38. package/lib/commonjs/handlers/gestures/GestureDetector.js +10 -0
  39. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  40. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
  41. package/lib/commonjs/index.js +8 -8
  42. package/lib/commonjs/index.js.map +1 -1
  43. package/lib/commonjs/mocks.js +2 -0
  44. package/lib/commonjs/mocks.js.map +1 -1
  45. package/lib/commonjs/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  46. package/lib/commonjs/web/Gestures.js +66 -0
  47. package/lib/commonjs/web/Gestures.js.map +1 -0
  48. package/lib/commonjs/web/constants.js +3 -8
  49. package/lib/commonjs/web/constants.js.map +1 -1
  50. package/lib/commonjs/web/handlers/FlingGestureHandler.js +36 -12
  51. package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
  52. package/lib/commonjs/web/handlers/GestureHandler.js +4 -2
  53. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  54. package/lib/commonjs/web/handlers/IGestureHandler.js +2 -0
  55. package/lib/commonjs/web/handlers/IGestureHandler.js.map +1 -0
  56. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +5 -6
  57. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
  58. package/lib/commonjs/web/interfaces.js +1 -13
  59. package/lib/commonjs/web/interfaces.js.map +1 -1
  60. package/lib/commonjs/web/tools/EventManager.js.map +1 -1
  61. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +114 -115
  62. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  63. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js +10 -5
  64. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js.map +1 -1
  65. package/lib/commonjs/web/tools/InteractionManager.js +12 -3
  66. package/lib/commonjs/web/tools/InteractionManager.js.map +1 -1
  67. package/lib/commonjs/web/tools/NodeManager.js.map +1 -1
  68. package/lib/commonjs/web/tools/PointerEventManager.js +55 -27
  69. package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
  70. package/lib/commonjs/web/tools/TouchEventManager.js +26 -5
  71. package/lib/commonjs/web/tools/TouchEventManager.js.map +1 -1
  72. package/lib/commonjs/web/tools/Vector.js +58 -0
  73. package/lib/commonjs/web/tools/Vector.js.map +1 -0
  74. package/lib/commonjs/web/utils.js +9 -1
  75. package/lib/commonjs/web/utils.js.map +1 -1
  76. package/lib/commonjs/web_hammer/NodeManager.js.map +1 -1
  77. package/lib/module/Directions.js +16 -4
  78. package/lib/module/Directions.js.map +1 -1
  79. package/lib/module/RNGestureHandlerModule.web.js +2 -39
  80. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  81. package/lib/module/components/DrawerLayout.js.map +1 -1
  82. package/lib/module/components/Swipeable.js +3 -1
  83. package/lib/module/components/Swipeable.js.map +1 -1
  84. package/lib/module/components/touchables/GenericTouchable.js +1 -0
  85. package/lib/module/components/touchables/GenericTouchable.js.map +1 -1
  86. package/lib/module/handlers/createHandler.js +2 -3
  87. package/lib/module/handlers/createHandler.js.map +1 -1
  88. package/lib/module/handlers/customDirectEventTypes.js +3 -0
  89. package/lib/module/handlers/customDirectEventTypes.js.map +1 -0
  90. package/lib/module/handlers/customDirectEventTypes.web.js +5 -0
  91. package/lib/module/handlers/customDirectEventTypes.web.js.map +1 -0
  92. package/lib/module/handlers/gestureHandlerCommon.js +11 -1
  93. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
  94. package/lib/module/handlers/gestures/GestureDetector.js +10 -0
  95. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  96. package/lib/module/handlers/gestures/gesture.js.map +1 -1
  97. package/lib/module/index.js +1 -1
  98. package/lib/module/index.js.map +1 -1
  99. package/lib/module/mocks.js +2 -0
  100. package/lib/module/mocks.js.map +1 -1
  101. package/lib/module/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  102. package/lib/module/web/Gestures.js +39 -0
  103. package/lib/module/web/Gestures.js.map +1 -0
  104. package/lib/module/web/constants.js +1 -6
  105. package/lib/module/web/constants.js.map +1 -1
  106. package/lib/module/web/handlers/FlingGestureHandler.js +34 -12
  107. package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
  108. package/lib/module/web/handlers/GestureHandler.js +3 -2
  109. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  110. package/lib/module/web/handlers/IGestureHandler.js +2 -0
  111. package/lib/module/web/handlers/IGestureHandler.js.map +1 -0
  112. package/lib/module/web/handlers/NativeViewGestureHandler.js +5 -6
  113. package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
  114. package/lib/module/web/interfaces.js +0 -11
  115. package/lib/module/web/interfaces.js.map +1 -1
  116. package/lib/module/web/tools/EventManager.js.map +1 -1
  117. package/lib/module/web/tools/GestureHandlerOrchestrator.js +114 -115
  118. package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  119. package/lib/module/web/tools/GestureHandlerWebDelegate.js +9 -4
  120. package/lib/module/web/tools/GestureHandlerWebDelegate.js.map +1 -1
  121. package/lib/module/web/tools/InteractionManager.js +9 -3
  122. package/lib/module/web/tools/InteractionManager.js.map +1 -1
  123. package/lib/module/web/tools/NodeManager.js.map +1 -1
  124. package/lib/module/web/tools/PointerEventManager.js +53 -26
  125. package/lib/module/web/tools/PointerEventManager.js.map +1 -1
  126. package/lib/module/web/tools/TouchEventManager.js +26 -5
  127. package/lib/module/web/tools/TouchEventManager.js.map +1 -1
  128. package/lib/module/web/tools/Vector.js +47 -0
  129. package/lib/module/web/tools/Vector.js.map +1 -0
  130. package/lib/module/web/utils.js +2 -0
  131. package/lib/module/web/utils.js.map +1 -1
  132. package/lib/module/web_hammer/NodeManager.js.map +1 -1
  133. package/lib/typescript/Directions.d.ts +7 -0
  134. package/lib/typescript/RNGestureHandlerModule.web.d.ts +4 -39
  135. package/lib/typescript/components/DrawerLayout.d.ts +1 -2
  136. package/lib/typescript/components/touchables/GenericTouchable.d.ts +2 -1
  137. package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +1 -1
  138. package/lib/typescript/handlers/customDirectEventTypes.d.ts +1 -0
  139. package/lib/typescript/handlers/customDirectEventTypes.web.d.ts +2 -0
  140. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +11 -2
  141. package/lib/typescript/handlers/gestures/GestureDetector.d.ts +2 -1
  142. package/lib/typescript/handlers/gestures/gesture.d.ts +1 -2
  143. package/lib/typescript/index.d.ts +1 -1
  144. package/lib/typescript/mocks.d.ts +1 -0
  145. package/lib/typescript/specs/RNGestureHandlerButtonNativeComponent.d.ts +4 -1
  146. package/lib/typescript/web/Gestures.d.ts +36 -0
  147. package/lib/typescript/web/constants.d.ts +1 -6
  148. package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +3 -3
  149. package/lib/typescript/web/handlers/GestureHandler.d.ts +11 -9
  150. package/lib/typescript/web/handlers/IGestureHandler.d.ts +38 -0
  151. package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +1 -0
  152. package/lib/typescript/web/interfaces.d.ts +7 -10
  153. package/lib/typescript/web/tools/EventManager.d.ts +15 -12
  154. package/lib/typescript/web/tools/GestureHandlerDelegate.d.ts +3 -4
  155. package/lib/typescript/web/tools/GestureHandlerOrchestrator.d.ts +7 -5
  156. package/lib/typescript/web/tools/GestureHandlerWebDelegate.d.ts +3 -3
  157. package/lib/typescript/web/tools/InteractionManager.d.ts +6 -6
  158. package/lib/typescript/web/tools/NodeManager.d.ts +4 -3
  159. package/lib/typescript/web/tools/PointerEventManager.d.ts +11 -2
  160. package/lib/typescript/web/tools/TouchEventManager.d.ts +6 -1
  161. package/lib/typescript/web/tools/Vector.d.ts +15 -0
  162. package/lib/typescript/web/utils.d.ts +4 -4
  163. package/lib/typescript/web_hammer/NodeManager.d.ts +1 -1
  164. package/package.json +2 -1
  165. package/src/Directions.ts +21 -4
  166. package/src/RNGestureHandlerModule.web.ts +3 -44
  167. package/src/components/DrawerLayout.tsx +1 -1
  168. package/src/components/Swipeable.tsx +2 -0
  169. package/src/components/touchables/GenericTouchable.tsx +3 -0
  170. package/src/handlers/createHandler.tsx +10 -4
  171. package/src/handlers/customDirectEventTypes.ts +2 -0
  172. package/src/handlers/customDirectEventTypes.web.ts +5 -0
  173. package/src/handlers/gestureHandlerCommon.ts +28 -1
  174. package/src/handlers/gestures/GestureDetector.tsx +15 -0
  175. package/src/handlers/gestures/gesture.ts +1 -1
  176. package/src/index.ts +1 -1
  177. package/src/mocks.ts +2 -0
  178. package/src/specs/RNGestureHandlerButtonNativeComponent.ts +4 -0
  179. package/src/web/Gestures.ts +41 -0
  180. package/src/web/constants.ts +1 -7
  181. package/src/web/handlers/FlingGestureHandler.ts +54 -24
  182. package/src/web/handlers/GestureHandler.ts +14 -10
  183. package/src/web/handlers/IGestureHandler.ts +50 -0
  184. package/src/web/handlers/NativeViewGestureHandler.ts +5 -6
  185. package/src/web/interfaces.ts +13 -10
  186. package/src/web/tools/EventManager.ts +16 -14
  187. package/src/web/tools/GestureHandlerDelegate.ts +3 -4
  188. package/src/web/tools/GestureHandlerOrchestrator.ts +160 -145
  189. package/src/web/tools/GestureHandlerWebDelegate.ts +14 -9
  190. package/src/web/tools/InteractionManager.ts +18 -12
  191. package/src/web/tools/NodeManager.ts +4 -3
  192. package/src/web/tools/PointerEventManager.ts +181 -166
  193. package/src/web/tools/TouchEventManager.ts +126 -114
  194. package/src/web/tools/Vector.ts +60 -0
  195. package/src/web/utils.ts +7 -4
  196. package/src/web_hammer/NodeManager.ts +1 -1
@@ -28,6 +28,7 @@ import {
28
28
  HandlerStateChangeEvent,
29
29
  UserSelect,
30
30
  ActiveCursor,
31
+ MouseButton,
31
32
  } from '../handlers/gestureHandlerCommon';
32
33
  import {
33
34
  PanGestureHandler,
@@ -38,7 +39,6 @@ import {
38
39
  TapGestureHandlerEventPayload,
39
40
  } from '../handlers/TapGestureHandler';
40
41
  import { State } from '../State';
41
- import { MouseButton } from '../web/interfaces';
42
42
 
43
43
  const DRAG_TOSS = 0.05;
44
44
 
@@ -541,6 +541,7 @@ export default class Swipeable extends Component<
541
541
  return (
542
542
  <PanGestureHandler
543
543
  activeOffsetX={[-dragOffsetFromRightEdge, dragOffsetFromLeftEdge]}
544
+ touchAction="pan-y"
544
545
  {...this.props}
545
546
  onGestureEvent={this.onGestureEvent}
546
547
  onHandlerStateChange={this.onHandlerStateChange}>
@@ -551,6 +552,7 @@ export default class Swipeable extends Component<
551
552
  {right}
552
553
  <TapGestureHandler
553
554
  enabled={rowState !== 0}
555
+ touchAction="pan-y"
554
556
  onHandlerStateChange={this.onTapHandlerStateChange}>
555
557
  <Animated.View
556
558
  pointerEvents={rowState === 0 ? 'auto' : 'box-only'}
@@ -15,6 +15,7 @@ import { BaseButton } from '../GestureButtons';
15
15
  import {
16
16
  GestureEvent,
17
17
  HandlerStateChangeEvent,
18
+ UserSelect,
18
19
  } from '../../handlers/gestureHandlerCommon';
19
20
  import { NativeViewGestureHandlerPayload } from '../../handlers/NativeViewGestureHandler';
20
21
  import { TouchableNativeFeedbackExtraProps } from './TouchableNativeFeedback.android';
@@ -51,6 +52,7 @@ export interface GenericTouchableProps
51
52
 
52
53
  containerStyle?: StyleProp<ViewStyle>;
53
54
  hitSlop?: Insets | number;
55
+ userSelect?: UserSelect;
54
56
  }
55
57
 
56
58
  interface InternalProps {
@@ -286,6 +288,7 @@ export default class GenericTouchable extends Component<
286
288
  }
287
289
  onGestureEvent={this.onGestureEvent}
288
290
  hitSlop={hitSlop}
291
+ userSelect={this.props.userSelect}
289
292
  shouldActivateOnStart={this.props.shouldActivateOnStart}
290
293
  disallowInterruption={this.props.disallowInterruption}
291
294
  testID={this.props.testID}
@@ -5,12 +5,10 @@ import {
5
5
  DeviceEventEmitter,
6
6
  EmitterSubscription,
7
7
  } from 'react-native';
8
- // @ts-ignore - its taken straight from RN
9
- import { customDirectEventTypes } from 'react-native/Libraries/Renderer/shims/ReactNativeViewConfigRegistry';
8
+ import { customDirectEventTypes } from './customDirectEventTypes';
10
9
  // @ts-ignore - it isn't typed by TS & don't have definitelyTyped types
11
10
  import deepEqual from 'lodash/isEqual';
12
11
  import RNGestureHandlerModule from '../RNGestureHandlerModule';
13
- import type RNGestureHandlerModuleWeb from '../RNGestureHandlerModule.web';
14
12
  import { State } from '../State';
15
13
  import {
16
14
  handlerIDToTag,
@@ -155,6 +153,14 @@ type InternalEventHandlers = {
155
153
  onGestureHandlerStateChange?: (event: any) => void;
156
154
  };
157
155
 
156
+ type AttachGestureHandlerWeb = (
157
+ handlerTag: number,
158
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
159
+ newView: any,
160
+ _actionType: ActionType,
161
+ propsRef: React.RefObject<unknown>
162
+ ) => void;
163
+
158
164
  const UNRESOLVED_REFS_RETRY_LIMIT = 1;
159
165
 
160
166
  // TODO(TS) - make sure that BaseGestureHandlerProps doesn't need other generic parameter to work with custom properties.
@@ -321,7 +327,7 @@ export default function createHandler<
321
327
  if (Platform.OS === 'web') {
322
328
  // typecast due to dynamic resolution, attachGestureHandler should have web version signature in this branch
323
329
  (
324
- RNGestureHandlerModule.attachGestureHandler as typeof RNGestureHandlerModuleWeb.attachGestureHandler
330
+ RNGestureHandlerModule.attachGestureHandler as AttachGestureHandlerWeb
325
331
  )(
326
332
  this.handlerTag,
327
333
  newViewTag,
@@ -0,0 +1,2 @@
1
+ // @ts-ignore - its taken straight from RN
2
+ export { customDirectEventTypes } from 'react-native/Libraries/Renderer/shims/ReactNativeViewConfigRegistry';
@@ -0,0 +1,5 @@
1
+ // customDirectEventTypes doesn't exist in react-native-web, therefore importing it
2
+ // directly in createHandler.tsx would end in crash.
3
+ const customDirectEventTypes = {};
4
+
5
+ export { customDirectEventTypes };
@@ -12,7 +12,6 @@ import { handlerIDToTag } from './handlersRegistry';
12
12
  import { toArray } from '../utils';
13
13
  import RNGestureHandlerModule from '../RNGestureHandlerModule';
14
14
  import { ghQueueMicrotask } from '../ghQueueMicrotask';
15
- import { MouseButton } from '../web/interfaces';
16
15
  import { PointerType } from '../PointerType';
17
16
 
18
17
  const commonProps = [
@@ -25,6 +24,7 @@ const commonProps = [
25
24
  'activeCursor',
26
25
  'mouseButton',
27
26
  'enableContextMenu',
27
+ 'touchAction',
28
28
  ] as const;
29
29
 
30
30
  const componentInteractionProps = [
@@ -113,6 +113,32 @@ export type ActiveCursor =
113
113
  | 'zoom-in'
114
114
  | 'zoom-out';
115
115
 
116
+ export enum MouseButton {
117
+ LEFT = 1,
118
+ RIGHT = 2,
119
+ MIDDLE = 4,
120
+ BUTTON_4 = 8,
121
+ BUTTON_5 = 16,
122
+ ALL = 31,
123
+ }
124
+
125
+ export type TouchAction =
126
+ | 'auto'
127
+ | 'none'
128
+ | 'pan-x'
129
+ | 'pan-left'
130
+ | 'pan-right'
131
+ | 'pan-y'
132
+ | 'pan-up'
133
+ | 'pan-down'
134
+ | 'pinch-zoom'
135
+ | 'manipulation'
136
+ | 'inherit'
137
+ | 'initial'
138
+ | 'revert'
139
+ | 'revert-layer'
140
+ | 'unset';
141
+
116
142
  //TODO(TS) events in handlers
117
143
 
118
144
  export interface GestureEvent<ExtraEventPayloadT = Record<string, unknown>> {
@@ -156,6 +182,7 @@ export type CommonGestureConfig = {
156
182
  activeCursor?: ActiveCursor;
157
183
  mouseButton?: MouseButton;
158
184
  enableContextMenu?: boolean;
185
+ touchAction?: TouchAction;
159
186
  };
160
187
 
161
188
  // Events payloads are types instead of interfaces due to TS limitation.
@@ -19,6 +19,7 @@ import {
19
19
  HandlerStateChangeEvent,
20
20
  scheduleFlushOperations,
21
21
  UserSelect,
22
+ TouchAction,
22
23
  } from '../gestureHandlerCommon';
23
24
  import {
24
25
  GestureStateManager,
@@ -614,11 +615,21 @@ const applyEnableContextMenuProp = (
614
615
  }
615
616
  };
616
617
 
618
+ const applyTouchActionProp = (
619
+ touchAction: TouchAction,
620
+ gesture: ComposedGesture | GestureType
621
+ ): void => {
622
+ for (const g of gesture.toGestureArray()) {
623
+ g.config.touchAction = touchAction;
624
+ }
625
+ };
626
+
617
627
  interface GestureDetectorProps {
618
628
  gesture: ComposedGesture | GestureType;
619
629
  children?: React.ReactNode;
620
630
  userSelect?: UserSelect;
621
631
  enableContextMenu?: boolean;
632
+ touchAction?: TouchAction;
622
633
  }
623
634
  interface GestureDetectorState {
624
635
  firstRender: boolean;
@@ -644,6 +655,10 @@ export const GestureDetector = (props: GestureDetectorProps) => {
644
655
  applyEnableContextMenuProp(props.enableContextMenu, gestureConfig);
645
656
  }
646
657
 
658
+ if (props.touchAction !== undefined) {
659
+ applyTouchActionProp(props.touchAction, gestureConfig);
660
+ }
661
+
647
662
  const gesture = gestureConfig.toGestureArray();
648
663
  const useReanimatedHook = gesture.some((g) => g.shouldUseReanimated);
649
664
 
@@ -7,6 +7,7 @@ import {
7
7
  GestureStateChangeEvent,
8
8
  GestureUpdateEvent,
9
9
  ActiveCursor,
10
+ MouseButton,
10
11
  } from '../gestureHandlerCommon';
11
12
  import { getNextHandlerTag } from '../handlersRegistry';
12
13
  import { GestureStateManagerType } from './gestureStateManager';
@@ -17,7 +18,6 @@ import { RotationGestureHandlerEventPayload } from '../RotationGestureHandler';
17
18
  import { TapGestureHandlerEventPayload } from '../TapGestureHandler';
18
19
  import { NativeViewGestureHandlerPayload } from '../NativeViewGestureHandler';
19
20
  import { isRemoteDebuggingEnabled } from '../../utils';
20
- import { MouseButton } from '../../web/interfaces';
21
21
 
22
22
  export type GestureType =
23
23
  | BaseGesture<Record<string, unknown>>
package/src/index.ts CHANGED
@@ -2,7 +2,6 @@ import { initialize } from './init';
2
2
 
3
3
  export { Directions } from './Directions';
4
4
  export { State } from './State';
5
- export { MouseButton } from './web/interfaces';
6
5
  export { PointerType } from './PointerType';
7
6
  export { default as gestureHandlerRootHOC } from './components/gestureHandlerRootHOC';
8
7
  export { default as GestureHandlerRootView } from './components/GestureHandlerRootView';
@@ -20,6 +19,7 @@ export type {
20
19
  GestureUpdateEvent,
21
20
  GestureStateChangeEvent,
22
21
  } from './handlers/gestureHandlerCommon';
22
+ export { MouseButton } from './handlers/gestureHandlerCommon';
23
23
  export type { GestureType } from './handlers/gestures/gesture';
24
24
  export type {
25
25
  TapGestureHandlerEventPayload,
package/src/mocks.ts CHANGED
@@ -22,6 +22,7 @@ const createGestureHandler = NOOP;
22
22
  const dropGestureHandler = NOOP;
23
23
  const updateGestureHandler = NOOP;
24
24
  const flushOperations = NOOP;
25
+ const install = NOOP;
25
26
  const NativeViewGestureHandler = View;
26
27
  const TapGestureHandler = View;
27
28
  const ForceTouchGestureHandler = View;
@@ -61,6 +62,7 @@ export default {
61
62
  dropGestureHandler,
62
63
  updateGestureHandler,
63
64
  flushOperations,
65
+ install,
64
66
  // probably can be removed
65
67
  Directions,
66
68
  State,
@@ -2,6 +2,7 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNati
2
2
  import type {
3
3
  Int32,
4
4
  WithDefault,
5
+ Float,
5
6
  } from 'react-native/Libraries/Types/CodegenTypes';
6
7
  import type { ViewProps, ColorValue } from 'react-native';
7
8
 
@@ -13,6 +14,9 @@ interface NativeProps extends ViewProps {
13
14
  rippleColor?: ColorValue;
14
15
  rippleRadius?: Int32;
15
16
  touchSoundDisabled?: WithDefault<boolean, false>;
17
+ borderWidth?: Float;
18
+ borderColor?: ColorValue;
19
+ borderStyle?: WithDefault<string, 'solid'>;
16
20
  }
17
21
 
18
22
  export default codegenNativeComponent<NativeProps>('RNGestureHandlerButton');
@@ -0,0 +1,41 @@
1
+ // Gesture Handlers
2
+ import PanGestureHandler from './handlers/PanGestureHandler';
3
+ import TapGestureHandler from './handlers/TapGestureHandler';
4
+ import LongPressGestureHandler from './handlers/LongPressGestureHandler';
5
+ import PinchGestureHandler from './handlers/PinchGestureHandler';
6
+ import RotationGestureHandler from './handlers/RotationGestureHandler';
7
+ import FlingGestureHandler from './handlers/FlingGestureHandler';
8
+ import NativeViewGestureHandler from './handlers/NativeViewGestureHandler';
9
+ import ManualGestureHandler from './handlers/ManualGestureHandler';
10
+ import HoverGestureHandler from './handlers/HoverGestureHandler';
11
+
12
+ //Hammer Handlers
13
+ import HammerNativeViewGestureHandler from '../web_hammer/NativeViewGestureHandler';
14
+ import HammerPanGestureHandler from '../web_hammer/PanGestureHandler';
15
+ import HammerTapGestureHandler from '../web_hammer/TapGestureHandler';
16
+ import HammerLongPressGestureHandler from '../web_hammer/LongPressGestureHandler';
17
+ import HammerPinchGestureHandler from '../web_hammer/PinchGestureHandler';
18
+ import HammerRotationGestureHandler from '../web_hammer/RotationGestureHandler';
19
+ import HammerFlingGestureHandler from '../web_hammer/FlingGestureHandler';
20
+
21
+ export const Gestures = {
22
+ NativeViewGestureHandler,
23
+ PanGestureHandler,
24
+ TapGestureHandler,
25
+ LongPressGestureHandler,
26
+ PinchGestureHandler,
27
+ RotationGestureHandler,
28
+ FlingGestureHandler,
29
+ ManualGestureHandler,
30
+ HoverGestureHandler,
31
+ };
32
+
33
+ export const HammerGestures = {
34
+ NativeViewGestureHandler: HammerNativeViewGestureHandler,
35
+ PanGestureHandler: HammerPanGestureHandler,
36
+ TapGestureHandler: HammerTapGestureHandler,
37
+ LongPressGestureHandler: HammerLongPressGestureHandler,
38
+ PinchGestureHandler: HammerPinchGestureHandler,
39
+ RotationGestureHandler: HammerRotationGestureHandler,
40
+ FlingGestureHandler: HammerFlingGestureHandler,
41
+ };
@@ -1,8 +1,2 @@
1
1
  export const DEFAULT_TOUCH_SLOP = 15;
2
-
3
- export const Direction = {
4
- RIGHT: 1,
5
- LEFT: 2,
6
- UP: 4,
7
- DOWN: 8,
8
- };
2
+ export const MINIMAL_FLING_VELOCITY = 0.1;
@@ -1,25 +1,28 @@
1
1
  import { State } from '../../State';
2
- import { Direction } from '../constants';
2
+ import { DiagonalDirections, Directions } from '../../Directions';
3
3
  import { AdaptedEvent, Config } from '../interfaces';
4
4
 
5
5
  import GestureHandler from './GestureHandler';
6
+ import Vector from '../tools/Vector';
7
+ import { coneToDeviation } from '../utils';
6
8
 
7
9
  const DEFAULT_MAX_DURATION_MS = 800;
8
- const DEFAULT_MIN_ACCEPTABLE_DELTA = 32;
9
- const DEFAULT_DIRECTION = Direction.RIGHT;
10
+ const DEFAULT_MIN_VELOCITY = 700;
11
+ const DEFAULT_ALIGNMENT_CONE = 30;
12
+ const DEFAULT_DIRECTION = Directions.RIGHT;
10
13
  const DEFAULT_NUMBER_OF_TOUCHES_REQUIRED = 1;
11
14
 
15
+ const AXIAL_DEVIATION_COSINE = coneToDeviation(DEFAULT_ALIGNMENT_CONE);
16
+ const DIAGONAL_DEVIATION_COSINE = coneToDeviation(90 - DEFAULT_ALIGNMENT_CONE);
17
+
12
18
  export default class FlingGestureHandler extends GestureHandler {
13
19
  private numberOfPointersRequired = DEFAULT_NUMBER_OF_TOUCHES_REQUIRED;
14
- private direction = DEFAULT_DIRECTION;
20
+ private direction: Directions = DEFAULT_DIRECTION;
15
21
 
16
22
  private maxDurationMs = DEFAULT_MAX_DURATION_MS;
17
- private minAcceptableDelta = DEFAULT_MIN_ACCEPTABLE_DELTA;
23
+ private minVelocity = DEFAULT_MIN_VELOCITY;
18
24
  private delayTimeout!: number;
19
25
 
20
- private startX = 0;
21
- private startY = 0;
22
-
23
26
  private maxNumberOfPointersSimultaneously = 0;
24
27
  private keyPointer = NaN;
25
28
 
@@ -40,9 +43,6 @@ export default class FlingGestureHandler extends GestureHandler {
40
43
  }
41
44
 
42
45
  private startFling(): void {
43
- this.startX = this.tracker.getLastX(this.keyPointer);
44
- this.startY = this.tracker.getLastY(this.keyPointer);
45
-
46
46
  this.begin();
47
47
 
48
48
  this.maxNumberOfPointersSimultaneously = 1;
@@ -51,21 +51,43 @@ export default class FlingGestureHandler extends GestureHandler {
51
51
  }
52
52
 
53
53
  private tryEndFling(): boolean {
54
+ const velocityVector = Vector.fromVelocity(this.tracker, this.keyPointer);
55
+
56
+ const getAlignment = (
57
+ direction: Directions | DiagonalDirections,
58
+ minimalAlignmentCosine: number
59
+ ) => {
60
+ return (
61
+ (direction & this.direction) === direction &&
62
+ velocityVector.isSimilar(
63
+ Vector.fromDirection(direction),
64
+ minimalAlignmentCosine
65
+ )
66
+ );
67
+ };
68
+
69
+ const axialDirectionsList = Object.values(Directions);
70
+ const diagonalDirectionsList = Object.values(DiagonalDirections);
71
+
72
+ // list of alignments to all activated directions
73
+ const axialAlignmentList = axialDirectionsList.map((direction) =>
74
+ getAlignment(direction, AXIAL_DEVIATION_COSINE)
75
+ );
76
+
77
+ const diagonalAlignmentList = diagonalDirectionsList.map((direction) =>
78
+ getAlignment(direction, DIAGONAL_DEVIATION_COSINE)
79
+ );
80
+
81
+ const isAligned =
82
+ axialAlignmentList.some(Boolean) || diagonalAlignmentList.some(Boolean);
83
+
84
+ const isFast = velocityVector.magnitude > this.minVelocity;
85
+
54
86
  if (
55
87
  this.maxNumberOfPointersSimultaneously ===
56
88
  this.numberOfPointersRequired &&
57
- ((this.direction & Direction.RIGHT &&
58
- this.tracker.getLastX(this.keyPointer) - this.startX >
59
- this.minAcceptableDelta) ||
60
- (this.direction & Direction.LEFT &&
61
- this.startX - this.tracker.getLastX(this.keyPointer) >
62
- this.minAcceptableDelta) ||
63
- (this.direction & Direction.UP &&
64
- this.startY - this.tracker.getLastY(this.keyPointer) >
65
- this.minAcceptableDelta) ||
66
- (this.direction & Direction.DOWN &&
67
- this.tracker.getLastY(this.keyPointer) - this.startY >
68
- this.minAcceptableDelta))
89
+ isAligned &&
90
+ isFast
69
91
  ) {
70
92
  clearTimeout(this.delayTimeout);
71
93
  this.activate();
@@ -120,7 +142,7 @@ export default class FlingGestureHandler extends GestureHandler {
120
142
  }
121
143
  }
122
144
 
123
- protected onPointerMove(event: AdaptedEvent): void {
145
+ private pointerMoveAction(event: AdaptedEvent): void {
124
146
  this.tracker.track(event);
125
147
 
126
148
  if (this.currentState !== State.BEGAN) {
@@ -128,10 +150,18 @@ export default class FlingGestureHandler extends GestureHandler {
128
150
  }
129
151
 
130
152
  this.tryEndFling();
153
+ }
131
154
 
155
+ protected onPointerMove(event: AdaptedEvent): void {
156
+ this.pointerMoveAction(event);
132
157
  super.onPointerMove(event);
133
158
  }
134
159
 
160
+ protected onPointerOutOfBounds(event: AdaptedEvent): void {
161
+ this.pointerMoveAction(event);
162
+ super.onPointerOutOfBounds(event);
163
+ }
164
+
135
165
  protected onPointerUp(event: AdaptedEvent): void {
136
166
  super.onPointerUp(event);
137
167
  this.onUp(event);
@@ -9,16 +9,17 @@ import {
9
9
  ResultTouchEvent,
10
10
  TouchEventType,
11
11
  EventTypes,
12
- MouseButton,
13
12
  } from '../interfaces';
14
13
  import EventManager from '../tools/EventManager';
15
14
  import GestureHandlerOrchestrator from '../tools/GestureHandlerOrchestrator';
16
15
  import InteractionManager from '../tools/InteractionManager';
17
16
  import PointerTracker, { TrackerElement } from '../tools/PointerTracker';
18
17
  import { GestureHandlerDelegate } from '../tools/GestureHandlerDelegate';
18
+ import IGestureHandler from './IGestureHandler';
19
+ import { MouseButton } from '../../handlers/gestureHandlerCommon';
19
20
  import { PointerType } from '../../PointerType';
20
21
 
21
- export default abstract class GestureHandler {
22
+ export default abstract class GestureHandler implements IGestureHandler {
22
23
  private lastSentState: State | null = null;
23
24
  protected currentState: State = State.UNDETERMINED;
24
25
 
@@ -40,9 +41,11 @@ export default abstract class GestureHandler {
40
41
  protected shouldResetProgress = false;
41
42
  protected pointerType: PointerType = PointerType.MOUSE;
42
43
 
43
- protected delegate: GestureHandlerDelegate<unknown>;
44
+ protected delegate: GestureHandlerDelegate<unknown, IGestureHandler>;
44
45
 
45
- public constructor(delegate: GestureHandlerDelegate<unknown>) {
46
+ public constructor(
47
+ delegate: GestureHandlerDelegate<unknown, IGestureHandler>
48
+ ) {
46
49
  this.delegate = delegate;
47
50
  }
48
51
 
@@ -71,7 +74,8 @@ export default abstract class GestureHandler {
71
74
  manager.setOnPointerOutOfBounds(this.onPointerOutOfBounds.bind(this));
72
75
  manager.setOnPointerMoveOver(this.onPointerMoveOver.bind(this));
73
76
  manager.setOnPointerMoveOut(this.onPointerMoveOut.bind(this));
74
- manager.setListeners();
77
+
78
+ manager.registerListeners();
75
79
  }
76
80
 
77
81
  //
@@ -229,7 +233,7 @@ export default abstract class GestureHandler {
229
233
  this.activationIndex = value;
230
234
  }
231
235
 
232
- public shouldWaitForHandlerFailure(handler: GestureHandler): boolean {
236
+ public shouldWaitForHandlerFailure(handler: IGestureHandler): boolean {
233
237
  if (handler === this) {
234
238
  return false;
235
239
  }
@@ -240,7 +244,7 @@ export default abstract class GestureHandler {
240
244
  );
241
245
  }
242
246
 
243
- public shouldRequireToWaitForFailure(handler: GestureHandler): boolean {
247
+ public shouldRequireToWaitForFailure(handler: IGestureHandler): boolean {
244
248
  if (handler === this) {
245
249
  return false;
246
250
  }
@@ -251,7 +255,7 @@ export default abstract class GestureHandler {
251
255
  );
252
256
  }
253
257
 
254
- public shouldRecognizeSimultaneously(handler: GestureHandler): boolean {
258
+ public shouldRecognizeSimultaneously(handler: IGestureHandler): boolean {
255
259
  if (handler === this) {
256
260
  return true;
257
261
  }
@@ -262,7 +266,7 @@ export default abstract class GestureHandler {
262
266
  );
263
267
  }
264
268
 
265
- public shouldBeCancelledByOther(handler: GestureHandler): boolean {
269
+ public shouldBeCancelledByOther(handler: IGestureHandler): boolean {
266
270
  if (handler === this) {
267
271
  return false;
268
272
  }
@@ -772,7 +776,7 @@ export default abstract class GestureHandler {
772
776
  return this.config;
773
777
  }
774
778
 
775
- public getDelegate(): GestureHandlerDelegate<unknown> {
779
+ public getDelegate(): GestureHandlerDelegate<unknown, IGestureHandler> {
776
780
  return this.delegate;
777
781
  }
778
782
 
@@ -0,0 +1,50 @@
1
+ import type { PointerType } from '../../PointerType';
2
+ import type { MouseButton } from '../../handlers/gestureHandlerCommon';
3
+ import type { State } from '../../State';
4
+ import type { Config } from '../interfaces';
5
+ import type EventManager from '../tools/EventManager';
6
+ import type { GestureHandlerDelegate } from '../tools/GestureHandlerDelegate';
7
+ import type PointerTracker from '../tools/PointerTracker';
8
+
9
+ export default interface IGestureHandler {
10
+ getTag: () => number;
11
+ getState: () => State;
12
+ getConfig: () => Config;
13
+ getDelegate: () => GestureHandlerDelegate<unknown, this>;
14
+
15
+ attachEventManager: (manager: EventManager<unknown>) => void;
16
+
17
+ isButtonInConfig: (
18
+ mouseButton: MouseButton | undefined
19
+ ) => boolean | number | undefined;
20
+ getPointerType: () => PointerType;
21
+
22
+ getTracker: () => PointerTracker;
23
+ getTrackedPointersID: () => number[];
24
+
25
+ begin: () => void;
26
+ activate: () => void;
27
+ end: () => void;
28
+ fail: () => void;
29
+ cancel: () => void;
30
+
31
+ reset: () => void;
32
+ isEnabled: () => boolean;
33
+ isActive: () => boolean;
34
+ setActive: (value: boolean) => void;
35
+ isAwaiting: () => boolean;
36
+ setAwaiting: (value: boolean) => void;
37
+ setActivationIndex: (value: number) => void;
38
+ setShouldResetProgress: (value: boolean) => void;
39
+
40
+ shouldWaitForHandlerFailure: (handler: IGestureHandler) => boolean;
41
+ shouldRequireToWaitForFailure: (handler: IGestureHandler) => boolean;
42
+ shouldRecognizeSimultaneously: (handler: IGestureHandler) => boolean;
43
+ shouldBeCancelledByOther: (handler: IGestureHandler) => boolean;
44
+
45
+ sendEvent: (newState: State, oldState: State) => void;
46
+
47
+ updateGestureConfig: (config: Config) => void;
48
+
49
+ isButton?: () => boolean;
50
+ }
@@ -28,15 +28,10 @@ export default class NativeViewGestureHandler extends GestureHandler {
28
28
  const view = this.delegate.getView() as HTMLElement;
29
29
 
30
30
  view.style['touchAction'] = 'auto';
31
-
32
31
  //@ts-ignore Turns on defualt touch behavior on Safari
33
32
  view.style['WebkitTouchCallout'] = 'auto';
34
33
 
35
- if (view.hasAttribute('role')) {
36
- this.buttonRole = true;
37
- } else {
38
- this.buttonRole = false;
39
- }
34
+ this.buttonRole = view.getAttribute('role') === 'button';
40
35
  }
41
36
 
42
37
  public updateGestureConfig({ enabled = true, ...props }: Config): void {
@@ -164,4 +159,8 @@ export default class NativeViewGestureHandler extends GestureHandler {
164
159
  public disallowsInterruption(): boolean {
165
160
  return this.disallowInterruption;
166
161
  }
162
+
163
+ public isButton(): boolean {
164
+ return this.buttonRole;
165
+ }
167
166
  }
@@ -1,4 +1,9 @@
1
- import { UserSelect, ActiveCursor } from '../handlers/gestureHandlerCommon';
1
+ import {
2
+ UserSelect,
3
+ ActiveCursor,
4
+ MouseButton,
5
+ TouchAction,
6
+ } from '../handlers/gestureHandlerCommon';
2
7
  import { Directions } from '../Directions';
3
8
  import { State } from '../State';
4
9
  import { PointerType } from '../PointerType';
@@ -23,6 +28,7 @@ type ConfigArgs =
23
28
  | boolean
24
29
  | HitSlop
25
30
  | UserSelect
31
+ | TouchAction
26
32
  | ActiveCursor
27
33
  | Directions
28
34
  | Handler[]
@@ -40,6 +46,7 @@ export interface Config extends Record<string, ConfigArgs> {
40
46
  activeCursor?: ActiveCursor;
41
47
  mouseButton?: MouseButton;
42
48
  enableContextMenu?: boolean;
49
+ touchAction?: TouchAction;
43
50
 
44
51
  activateAfterLongPress?: number;
45
52
  failOffsetXStart?: number;
@@ -83,6 +90,11 @@ interface NativeEvent extends Record<string, NativeEventArgs> {
83
90
  pointerType: PointerType;
84
91
  }
85
92
 
93
+ export interface Point {
94
+ x: number;
95
+ y: number;
96
+ }
97
+
86
98
  export interface PointerData {
87
99
  id: number;
88
100
  x: number;
@@ -133,15 +145,6 @@ export interface AdaptedEvent {
133
145
  touchEventType?: TouchEventType;
134
146
  }
135
147
 
136
- export enum MouseButton {
137
- LEFT = 1,
138
- RIGHT = 2,
139
- MIDDLE = 4,
140
- BUTTON_4 = 8,
141
- BUTTON_5 = 16,
142
- ALL = 31,
143
- }
144
-
145
148
  export enum EventTypes {
146
149
  DOWN,
147
150
  ADDITIONAL_POINTER_DOWN,