react-native-gesture-handler 2.26.0 → 2.27.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (415) hide show
  1. package/README.md +69 -0
  2. package/android/src/main/jni/CMakeLists.txt +7 -26
  3. package/lib/commonjs/components/Pressable/Pressable.js +139 -188
  4. package/lib/commonjs/components/Pressable/Pressable.js.map +1 -1
  5. package/lib/commonjs/components/Pressable/StateMachine.js +38 -0
  6. package/lib/commonjs/components/Pressable/StateMachine.js.map +1 -0
  7. package/lib/commonjs/components/Pressable/stateDefinitions.js +88 -0
  8. package/lib/commonjs/components/Pressable/stateDefinitions.js.map +1 -0
  9. package/lib/commonjs/components/Pressable/utils.js +1 -1
  10. package/lib/commonjs/components/Pressable/utils.js.map +1 -1
  11. package/lib/commonjs/handlers/gestures/forceTouchGesture.js +12 -0
  12. package/lib/commonjs/handlers/gestures/forceTouchGesture.js.map +1 -1
  13. package/lib/commonjs/handlers/gestures/gestureObjects.js +3 -1
  14. package/lib/commonjs/handlers/gestures/gestureObjects.js.map +1 -1
  15. package/lib/commonjs/web/detectors/RotationGestureDetector.js +3 -0
  16. package/lib/commonjs/web/detectors/RotationGestureDetector.js.map +1 -1
  17. package/lib/commonjs/web/handlers/FlingGestureHandler.js +3 -0
  18. package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
  19. package/lib/commonjs/web/handlers/GestureHandler.js +6 -6
  20. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  21. package/lib/commonjs/web/handlers/PanGestureHandler.js +24 -33
  22. package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
  23. package/lib/commonjs/web/handlers/TapGestureHandler.js +15 -17
  24. package/lib/commonjs/web/handlers/TapGestureHandler.js.map +1 -1
  25. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +1 -1
  26. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  27. package/lib/commonjs/web/tools/PointerEventManager.js +1 -1
  28. package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
  29. package/lib/commonjs/web/tools/PointerTracker.js +12 -11
  30. package/lib/commonjs/web/tools/PointerTracker.js.map +1 -1
  31. package/lib/commonjs/web/tools/Vector.js +1 -1
  32. package/lib/commonjs/web/tools/Vector.js.map +1 -1
  33. package/lib/module/components/Pressable/Pressable.js +141 -190
  34. package/lib/module/components/Pressable/Pressable.js.map +1 -1
  35. package/lib/module/components/Pressable/StateMachine.js +34 -0
  36. package/lib/module/components/Pressable/StateMachine.js.map +1 -0
  37. package/lib/module/components/Pressable/stateDefinitions.js +83 -0
  38. package/lib/module/components/Pressable/stateDefinitions.js.map +1 -0
  39. package/lib/module/components/Pressable/utils.js +1 -1
  40. package/lib/module/components/Pressable/utils.js.map +1 -1
  41. package/lib/module/handlers/gestures/forceTouchGesture.js +13 -0
  42. package/lib/module/handlers/gestures/forceTouchGesture.js.map +1 -1
  43. package/lib/module/handlers/gestures/gestureObjects.js +3 -1
  44. package/lib/module/handlers/gestures/gestureObjects.js.map +1 -1
  45. package/lib/module/web/detectors/RotationGestureDetector.js +3 -0
  46. package/lib/module/web/detectors/RotationGestureDetector.js.map +1 -1
  47. package/lib/module/web/handlers/FlingGestureHandler.js +3 -0
  48. package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
  49. package/lib/module/web/handlers/GestureHandler.js +6 -6
  50. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  51. package/lib/module/web/handlers/PanGestureHandler.js +24 -33
  52. package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
  53. package/lib/module/web/handlers/TapGestureHandler.js +15 -17
  54. package/lib/module/web/handlers/TapGestureHandler.js.map +1 -1
  55. package/lib/module/web/tools/GestureHandlerOrchestrator.js +1 -1
  56. package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  57. package/lib/module/web/tools/PointerEventManager.js +1 -1
  58. package/lib/module/web/tools/PointerEventManager.js.map +1 -1
  59. package/lib/module/web/tools/PointerTracker.js +12 -11
  60. package/lib/module/web/tools/PointerTracker.js.map +1 -1
  61. package/lib/module/web/tools/Vector.js +1 -1
  62. package/lib/module/web/tools/Vector.js.map +1 -1
  63. package/lib/typescript/ActionType.d.ts +0 -1
  64. package/lib/typescript/ActionType.js +6 -0
  65. package/lib/typescript/Directions.d.ts +0 -1
  66. package/lib/typescript/Directions.js +18 -0
  67. package/lib/typescript/EnableNewWebImplementation.d.ts +0 -1
  68. package/lib/typescript/EnableNewWebImplementation.js +30 -0
  69. package/lib/typescript/GestureHandlerRootViewContext.d.ts +0 -1
  70. package/lib/typescript/GestureHandlerRootViewContext.js +2 -0
  71. package/lib/typescript/PlatformConstants.d.ts +0 -1
  72. package/lib/typescript/PlatformConstants.js +3 -0
  73. package/lib/typescript/PlatformConstants.web.d.ts +0 -1
  74. package/lib/typescript/PlatformConstants.web.js +5 -0
  75. package/lib/typescript/PointerType.d.ts +0 -1
  76. package/lib/typescript/PointerType.js +8 -0
  77. package/lib/typescript/RNGestureHandlerModule.d.ts +0 -1
  78. package/lib/typescript/RNGestureHandlerModule.js +4 -0
  79. package/lib/typescript/RNGestureHandlerModule.web.d.ts +0 -1
  80. package/lib/typescript/RNGestureHandlerModule.web.js +92 -0
  81. package/lib/typescript/RNGestureHandlerModule.windows.d.ts +0 -1
  82. package/lib/typescript/RNGestureHandlerModule.windows.js +47 -0
  83. package/lib/typescript/RNRenderer.d.ts +0 -1
  84. package/lib/typescript/RNRenderer.js +3 -0
  85. package/lib/typescript/RNRenderer.web.d.ts +0 -1
  86. package/lib/typescript/RNRenderer.web.js +3 -0
  87. package/lib/typescript/State.d.ts +0 -1
  88. package/lib/typescript/State.js +9 -0
  89. package/lib/typescript/TouchEventType.d.ts +0 -1
  90. package/lib/typescript/TouchEventType.js +7 -0
  91. package/lib/typescript/components/DrawerLayout.d.ts +0 -1
  92. package/lib/typescript/components/DrawerLayout.js +417 -0
  93. package/lib/typescript/components/GestureButtons.d.ts +0 -1
  94. package/lib/typescript/components/GestureButtons.js +165 -0
  95. package/lib/typescript/components/GestureButtonsProps.d.ts +0 -1
  96. package/lib/typescript/components/GestureButtonsProps.js +1 -0
  97. package/lib/typescript/components/GestureComponents.d.ts +0 -1
  98. package/lib/typescript/components/GestureComponents.js +67 -0
  99. package/lib/typescript/components/GestureComponents.web.d.ts +0 -1
  100. package/lib/typescript/components/GestureComponents.web.js +21 -0
  101. package/lib/typescript/components/GestureHandlerButton.d.ts +0 -1
  102. package/lib/typescript/components/GestureHandlerButton.js +2 -0
  103. package/lib/typescript/components/GestureHandlerButton.web.d.ts +0 -1
  104. package/lib/typescript/components/GestureHandlerButton.web.js +3 -0
  105. package/lib/typescript/components/GestureHandlerRootView.android.d.ts +0 -1
  106. package/lib/typescript/components/GestureHandlerRootView.android.js +17 -0
  107. package/lib/typescript/components/GestureHandlerRootView.d.ts +0 -1
  108. package/lib/typescript/components/GestureHandlerRootView.js +16 -0
  109. package/lib/typescript/components/GestureHandlerRootView.web.d.ts +0 -1
  110. package/lib/typescript/components/GestureHandlerRootView.web.js +11 -0
  111. package/lib/typescript/components/Pressable/Pressable.d.ts +1 -3
  112. package/lib/typescript/components/Pressable/Pressable.d.ts.map +1 -1
  113. package/lib/typescript/components/Pressable/Pressable.js +231 -0
  114. package/lib/typescript/components/Pressable/PressableProps.d.ts +15 -2
  115. package/lib/typescript/components/Pressable/PressableProps.d.ts.map +1 -1
  116. package/lib/typescript/components/Pressable/PressableProps.js +1 -0
  117. package/lib/typescript/components/Pressable/StateMachine.d.ts +14 -0
  118. package/lib/typescript/components/Pressable/StateMachine.d.ts.map +1 -0
  119. package/lib/typescript/components/Pressable/StateMachine.js +34 -0
  120. package/lib/typescript/components/Pressable/index.d.ts +0 -1
  121. package/lib/typescript/components/Pressable/index.js +1 -0
  122. package/lib/typescript/components/Pressable/stateDefinitions.d.ts +9 -0
  123. package/lib/typescript/components/Pressable/stateDefinitions.d.ts.map +1 -0
  124. package/lib/typescript/components/Pressable/stateDefinitions.js +104 -0
  125. package/lib/typescript/components/Pressable/utils.d.ts +3 -7
  126. package/lib/typescript/components/Pressable/utils.d.ts.map +1 -1
  127. package/lib/typescript/components/Pressable/utils.js +80 -0
  128. package/lib/typescript/components/ReanimatedDrawerLayout.d.ts +0 -1
  129. package/lib/typescript/components/ReanimatedDrawerLayout.js +364 -0
  130. package/lib/typescript/components/ReanimatedSwipeable.d.ts +0 -1
  131. package/lib/typescript/components/ReanimatedSwipeable.js +400 -0
  132. package/lib/typescript/components/Swipeable.d.ts +0 -1
  133. package/lib/typescript/components/Swipeable.js +287 -0
  134. package/lib/typescript/components/Text.d.ts +0 -1
  135. package/lib/typescript/components/Text.js +38 -0
  136. package/lib/typescript/components/gestureHandlerRootHOC.d.ts +0 -1
  137. package/lib/typescript/components/gestureHandlerRootHOC.js +18 -0
  138. package/lib/typescript/components/touchables/ExtraButtonProps.d.ts +0 -1
  139. package/lib/typescript/components/touchables/ExtraButtonProps.js +1 -0
  140. package/lib/typescript/components/touchables/GenericTouchable.d.ts +0 -1
  141. package/lib/typescript/components/touchables/GenericTouchable.js +221 -0
  142. package/lib/typescript/components/touchables/GenericTouchableProps.d.ts +0 -1
  143. package/lib/typescript/components/touchables/GenericTouchableProps.js +1 -0
  144. package/lib/typescript/components/touchables/TouchableHighlight.d.ts +0 -1
  145. package/lib/typescript/components/touchables/TouchableHighlight.js +75 -0
  146. package/lib/typescript/components/touchables/TouchableNativeFeedback.android.d.ts +0 -1
  147. package/lib/typescript/components/touchables/TouchableNativeFeedback.android.js +65 -0
  148. package/lib/typescript/components/touchables/TouchableNativeFeedback.d.ts +0 -1
  149. package/lib/typescript/components/touchables/TouchableNativeFeedback.js +6 -0
  150. package/lib/typescript/components/touchables/TouchableNativeFeedbackProps.d.ts +0 -1
  151. package/lib/typescript/components/touchables/TouchableNativeFeedbackProps.js +1 -0
  152. package/lib/typescript/components/touchables/TouchableOpacity.d.ts +0 -1
  153. package/lib/typescript/components/touchables/TouchableOpacity.js +51 -0
  154. package/lib/typescript/components/touchables/TouchableWithoutFeedback.d.ts +0 -1
  155. package/lib/typescript/components/touchables/TouchableWithoutFeedback.js +10 -0
  156. package/lib/typescript/components/touchables/index.d.ts +0 -1
  157. package/lib/typescript/components/touchables/index.js +4 -0
  158. package/lib/typescript/components/utils.d.ts +0 -1
  159. package/lib/typescript/components/utils.js +11 -0
  160. package/lib/typescript/findNodeHandle.d.ts +0 -1
  161. package/lib/typescript/findNodeHandle.js +2 -0
  162. package/lib/typescript/findNodeHandle.web.d.ts +0 -1
  163. package/lib/typescript/findNodeHandle.web.js +31 -0
  164. package/lib/typescript/getShadowNodeFromRef.d.ts +0 -1
  165. package/lib/typescript/getShadowNodeFromRef.js +45 -0
  166. package/lib/typescript/getShadowNodeFromRef.web.d.ts +0 -1
  167. package/lib/typescript/getShadowNodeFromRef.web.js +7 -0
  168. package/lib/typescript/ghQueueMicrotask.d.ts +0 -1
  169. package/lib/typescript/ghQueueMicrotask.js +7 -0
  170. package/lib/typescript/handlers/FlingGestureHandler.d.ts +0 -1
  171. package/lib/typescript/handlers/FlingGestureHandler.js +19 -0
  172. package/lib/typescript/handlers/ForceTouchGestureHandler.d.ts +0 -1
  173. package/lib/typescript/handlers/ForceTouchGestureHandler.js +37 -0
  174. package/lib/typescript/handlers/GestureHandlerEventPayload.d.ts +3 -1
  175. package/lib/typescript/handlers/GestureHandlerEventPayload.d.ts.map +1 -1
  176. package/lib/typescript/handlers/GestureHandlerEventPayload.js +1 -0
  177. package/lib/typescript/handlers/LongPressGestureHandler.d.ts +0 -1
  178. package/lib/typescript/handlers/LongPressGestureHandler.js +22 -0
  179. package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +0 -1
  180. package/lib/typescript/handlers/NativeViewGestureHandler.js +20 -0
  181. package/lib/typescript/handlers/PanGestureHandler.d.ts +0 -1
  182. package/lib/typescript/handlers/PanGestureHandler.js +128 -0
  183. package/lib/typescript/handlers/PinchGestureHandler.d.ts +0 -1
  184. package/lib/typescript/handlers/PinchGestureHandler.js +12 -0
  185. package/lib/typescript/handlers/PressabilityDebugView.d.ts +0 -1
  186. package/lib/typescript/handlers/PressabilityDebugView.js +2 -0
  187. package/lib/typescript/handlers/PressabilityDebugView.web.d.ts +0 -1
  188. package/lib/typescript/handlers/PressabilityDebugView.web.js +4 -0
  189. package/lib/typescript/handlers/RotationGestureHandler.d.ts +0 -1
  190. package/lib/typescript/handlers/RotationGestureHandler.js +12 -0
  191. package/lib/typescript/handlers/TapGestureHandler.d.ts +0 -1
  192. package/lib/typescript/handlers/TapGestureHandler.js +26 -0
  193. package/lib/typescript/handlers/createHandler.d.ts +0 -1
  194. package/lib/typescript/handlers/createHandler.js +375 -0
  195. package/lib/typescript/handlers/createNativeWrapper.d.ts +0 -1
  196. package/lib/typescript/handlers/createNativeWrapper.js +67 -0
  197. package/lib/typescript/handlers/customDirectEventTypes.d.ts +0 -1
  198. package/lib/typescript/handlers/customDirectEventTypes.js +2 -0
  199. package/lib/typescript/handlers/customDirectEventTypes.web.d.ts +0 -1
  200. package/lib/typescript/handlers/customDirectEventTypes.web.js +4 -0
  201. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +0 -1
  202. package/lib/typescript/handlers/gestureHandlerCommon.js +42 -0
  203. package/lib/typescript/handlers/gestureHandlerTypesCompat.d.ts +9 -1
  204. package/lib/typescript/handlers/gestureHandlerTypesCompat.d.ts.map +1 -1
  205. package/lib/typescript/handlers/gestureHandlerTypesCompat.js +1 -0
  206. package/lib/typescript/handlers/gestures/GestureDetector/Wrap.d.ts +0 -1
  207. package/lib/typescript/handlers/gestures/GestureDetector/Wrap.js +22 -0
  208. package/lib/typescript/handlers/gestures/GestureDetector/Wrap.web.d.ts +0 -1
  209. package/lib/typescript/handlers/gestures/GestureDetector/Wrap.web.js +24 -0
  210. package/lib/typescript/handlers/gestures/GestureDetector/attachHandlers.d.ts +0 -1
  211. package/lib/typescript/handlers/gestures/GestureDetector/attachHandlers.js +55 -0
  212. package/lib/typescript/handlers/gestures/GestureDetector/dropHandlers.d.ts +0 -1
  213. package/lib/typescript/handlers/gestures/GestureDetector/dropHandlers.js +12 -0
  214. package/lib/typescript/handlers/gestures/GestureDetector/index.d.ts +0 -1
  215. package/lib/typescript/handlers/gestures/GestureDetector/index.js +114 -0
  216. package/lib/typescript/handlers/gestures/GestureDetector/needsToReattach.d.ts +0 -1
  217. package/lib/typescript/handlers/gestures/GestureDetector/needsToReattach.js +18 -0
  218. package/lib/typescript/handlers/gestures/GestureDetector/types.d.ts +0 -1
  219. package/lib/typescript/handlers/gestures/GestureDetector/types.js +1 -0
  220. package/lib/typescript/handlers/gestures/GestureDetector/updateHandlers.d.ts +0 -1
  221. package/lib/typescript/handlers/gestures/GestureDetector/updateHandlers.js +54 -0
  222. package/lib/typescript/handlers/gestures/GestureDetector/useAnimatedGesture.d.ts +0 -1
  223. package/lib/typescript/handlers/gestures/GestureDetector/useAnimatedGesture.js +137 -0
  224. package/lib/typescript/handlers/gestures/GestureDetector/useDetectorUpdater.d.ts +0 -1
  225. package/lib/typescript/handlers/gestures/GestureDetector/useDetectorUpdater.js +48 -0
  226. package/lib/typescript/handlers/gestures/GestureDetector/useMountReactions.d.ts +0 -1
  227. package/lib/typescript/handlers/gestures/GestureDetector/useMountReactions.js +35 -0
  228. package/lib/typescript/handlers/gestures/GestureDetector/useViewRefHandler.d.ts +0 -1
  229. package/lib/typescript/handlers/gestures/GestureDetector/useViewRefHandler.js +32 -0
  230. package/lib/typescript/handlers/gestures/GestureDetector/utils.d.ts +0 -1
  231. package/lib/typescript/handlers/gestures/GestureDetector/utils.js +140 -0
  232. package/lib/typescript/handlers/gestures/eventReceiver.d.ts +0 -1
  233. package/lib/typescript/handlers/gestures/eventReceiver.js +105 -0
  234. package/lib/typescript/handlers/gestures/flingGesture.d.ts +0 -1
  235. package/lib/typescript/handlers/gestures/flingGesture.js +27 -0
  236. package/lib/typescript/handlers/gestures/forceTouchGesture.d.ts +9 -1
  237. package/lib/typescript/handlers/gestures/forceTouchGesture.d.ts.map +1 -1
  238. package/lib/typescript/handlers/gestures/forceTouchGesture.js +57 -0
  239. package/lib/typescript/handlers/gestures/gesture.d.ts +0 -1
  240. package/lib/typescript/handlers/gestures/gesture.js +303 -0
  241. package/lib/typescript/handlers/gestures/gestureComposition.d.ts +0 -1
  242. package/lib/typescript/handlers/gestures/gestureComposition.js +78 -0
  243. package/lib/typescript/handlers/gestures/gestureObjects.d.ts +3 -2
  244. package/lib/typescript/handlers/gestures/gestureObjects.d.ts.map +1 -1
  245. package/lib/typescript/handlers/gestures/gestureObjects.js +125 -0
  246. package/lib/typescript/handlers/gestures/gestureStateManager.d.ts +0 -1
  247. package/lib/typescript/handlers/gestures/gestureStateManager.js +60 -0
  248. package/lib/typescript/handlers/gestures/gestureStateManager.web.d.ts +0 -1
  249. package/lib/typescript/handlers/gestures/gestureStateManager.web.js +19 -0
  250. package/lib/typescript/handlers/gestures/hoverGesture.d.ts +0 -1
  251. package/lib/typescript/handlers/gestures/hoverGesture.js +45 -0
  252. package/lib/typescript/handlers/gestures/longPressGesture.d.ts +0 -1
  253. package/lib/typescript/handlers/gestures/longPressGesture.js +35 -0
  254. package/lib/typescript/handlers/gestures/manualGesture.d.ts +0 -1
  255. package/lib/typescript/handlers/gestures/manualGesture.js +16 -0
  256. package/lib/typescript/handlers/gestures/nativeGesture.d.ts +0 -1
  257. package/lib/typescript/handlers/gestures/nativeGesture.js +24 -0
  258. package/lib/typescript/handlers/gestures/panGesture.d.ts +0 -1
  259. package/lib/typescript/handlers/gestures/panGesture.js +181 -0
  260. package/lib/typescript/handlers/gestures/pinchGesture.d.ts +0 -1
  261. package/lib/typescript/handlers/gestures/pinchGesture.js +27 -0
  262. package/lib/typescript/handlers/gestures/reanimatedWrapper.d.ts +0 -1
  263. package/lib/typescript/handlers/gestures/reanimatedWrapper.js +23 -0
  264. package/lib/typescript/handlers/gestures/rotationGesture.d.ts +0 -1
  265. package/lib/typescript/handlers/gestures/rotationGesture.js +27 -0
  266. package/lib/typescript/handlers/gestures/tapGesture.d.ts +0 -1
  267. package/lib/typescript/handlers/gestures/tapGesture.js +72 -0
  268. package/lib/typescript/handlers/getNextHandlerTag.d.ts +0 -1
  269. package/lib/typescript/handlers/getNextHandlerTag.js +4 -0
  270. package/lib/typescript/handlers/handlersRegistry.d.ts +0 -1
  271. package/lib/typescript/handlers/handlersRegistry.js +36 -0
  272. package/lib/typescript/handlers/utils.d.ts +0 -1
  273. package/lib/typescript/handlers/utils.js +58 -0
  274. package/lib/typescript/index.d.ts +0 -1
  275. package/lib/typescript/index.js +28 -0
  276. package/lib/typescript/init.d.ts +0 -1
  277. package/lib/typescript/init.js +15 -0
  278. package/lib/typescript/jestUtils/index.d.ts +0 -1
  279. package/lib/typescript/jestUtils/index.js +1 -0
  280. package/lib/typescript/jestUtils/jestUtils.d.ts +0 -1
  281. package/lib/typescript/jestUtils/jestUtils.js +290 -0
  282. package/lib/typescript/mocks.d.ts +0 -1
  283. package/lib/typescript/mocks.js +59 -0
  284. package/lib/typescript/mountRegistry.d.ts +0 -1
  285. package/lib/typescript/mountRegistry.js +29 -0
  286. package/lib/typescript/specs/NativeRNGestureHandlerModule.d.ts +0 -1
  287. package/lib/typescript/specs/NativeRNGestureHandlerModule.js +2 -0
  288. package/lib/typescript/specs/RNGestureHandlerButtonNativeComponent.d.ts +0 -1
  289. package/lib/typescript/specs/RNGestureHandlerButtonNativeComponent.js +2 -0
  290. package/lib/typescript/specs/RNGestureHandlerRootViewNativeComponent.d.ts +0 -1
  291. package/lib/typescript/specs/RNGestureHandlerRootViewNativeComponent.js +2 -0
  292. package/lib/typescript/typeUtils.d.ts +0 -1
  293. package/lib/typescript/typeUtils.js +1 -0
  294. package/lib/typescript/utils.d.ts +0 -1
  295. package/lib/typescript/utils.js +80 -0
  296. package/lib/typescript/web/Gestures.d.ts +0 -1
  297. package/lib/typescript/web/Gestures.js +38 -0
  298. package/lib/typescript/web/constants.d.ts +0 -1
  299. package/lib/typescript/web/constants.js +2 -0
  300. package/lib/typescript/web/detectors/RotationGestureDetector.d.ts +0 -1
  301. package/lib/typescript/web/detectors/RotationGestureDetector.d.ts.map +1 -1
  302. package/lib/typescript/web/detectors/RotationGestureDetector.js +122 -0
  303. package/lib/typescript/web/detectors/ScaleGestureDetector.d.ts +0 -1
  304. package/lib/typescript/web/detectors/ScaleGestureDetector.js +117 -0
  305. package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +0 -1
  306. package/lib/typescript/web/handlers/FlingGestureHandler.d.ts.map +1 -1
  307. package/lib/typescript/web/handlers/FlingGestureHandler.js +133 -0
  308. package/lib/typescript/web/handlers/GestureHandler.d.ts +0 -1
  309. package/lib/typescript/web/handlers/GestureHandler.d.ts.map +1 -1
  310. package/lib/typescript/web/handlers/GestureHandler.js +656 -0
  311. package/lib/typescript/web/handlers/HoverGestureHandler.d.ts +0 -1
  312. package/lib/typescript/web/handlers/HoverGestureHandler.js +37 -0
  313. package/lib/typescript/web/handlers/IGestureHandler.d.ts +0 -1
  314. package/lib/typescript/web/handlers/IGestureHandler.js +1 -0
  315. package/lib/typescript/web/handlers/LongPressGestureHandler.d.ts +0 -1
  316. package/lib/typescript/web/handlers/LongPressGestureHandler.js +136 -0
  317. package/lib/typescript/web/handlers/ManualGestureHandler.d.ts +0 -1
  318. package/lib/typescript/web/handlers/ManualGestureHandler.js +29 -0
  319. package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +0 -1
  320. package/lib/typescript/web/handlers/NativeViewGestureHandler.js +133 -0
  321. package/lib/typescript/web/handlers/PanGestureHandler.d.ts +2 -1
  322. package/lib/typescript/web/handlers/PanGestureHandler.d.ts.map +1 -1
  323. package/lib/typescript/web/handlers/PanGestureHandler.js +420 -0
  324. package/lib/typescript/web/handlers/PinchGestureHandler.d.ts +0 -1
  325. package/lib/typescript/web/handlers/PinchGestureHandler.js +117 -0
  326. package/lib/typescript/web/handlers/RotationGestureHandler.d.ts +0 -1
  327. package/lib/typescript/web/handlers/RotationGestureHandler.js +122 -0
  328. package/lib/typescript/web/handlers/TapGestureHandler.d.ts +1 -1
  329. package/lib/typescript/web/handlers/TapGestureHandler.d.ts.map +1 -1
  330. package/lib/typescript/web/handlers/TapGestureHandler.js +202 -0
  331. package/lib/typescript/web/interfaces.d.ts +0 -1
  332. package/lib/typescript/web/interfaces.js +25 -0
  333. package/lib/typescript/web/tools/CircularBuffer.d.ts +0 -1
  334. package/lib/typescript/web/tools/CircularBuffer.js +37 -0
  335. package/lib/typescript/web/tools/EventManager.d.ts +0 -1
  336. package/lib/typescript/web/tools/EventManager.js +85 -0
  337. package/lib/typescript/web/tools/GestureHandlerDelegate.d.ts +0 -1
  338. package/lib/typescript/web/tools/GestureHandlerDelegate.js +1 -0
  339. package/lib/typescript/web/tools/GestureHandlerOrchestrator.d.ts +0 -1
  340. package/lib/typescript/web/tools/GestureHandlerOrchestrator.d.ts.map +1 -1
  341. package/lib/typescript/web/tools/GestureHandlerOrchestrator.js +273 -0
  342. package/lib/typescript/web/tools/GestureHandlerWebDelegate.d.ts +0 -1
  343. package/lib/typescript/web/tools/GestureHandlerWebDelegate.js +169 -0
  344. package/lib/typescript/web/tools/InteractionManager.d.ts +0 -1
  345. package/lib/typescript/web/tools/InteractionManager.js +91 -0
  346. package/lib/typescript/web/tools/KeyboardEventManager.d.ts +0 -1
  347. package/lib/typescript/web/tools/KeyboardEventManager.js +73 -0
  348. package/lib/typescript/web/tools/LeastSquareSolver.d.ts +0 -1
  349. package/lib/typescript/web/tools/LeastSquareSolver.js +147 -0
  350. package/lib/typescript/web/tools/NodeManager.d.ts +0 -1
  351. package/lib/typescript/web/tools/NodeManager.js +28 -0
  352. package/lib/typescript/web/tools/PointerEventManager.d.ts +0 -1
  353. package/lib/typescript/web/tools/PointerEventManager.js +179 -0
  354. package/lib/typescript/web/tools/PointerTracker.d.ts +3 -4
  355. package/lib/typescript/web/tools/PointerTracker.d.ts.map +1 -1
  356. package/lib/typescript/web/tools/PointerTracker.js +161 -0
  357. package/lib/typescript/web/tools/Vector.d.ts +1 -2
  358. package/lib/typescript/web/tools/Vector.js +43 -0
  359. package/lib/typescript/web/tools/VelocityTracker.d.ts +0 -1
  360. package/lib/typescript/web/tools/VelocityTracker.js +76 -0
  361. package/lib/typescript/web/tools/WheelEventManager.d.ts +0 -1
  362. package/lib/typescript/web/tools/WheelEventManager.js +40 -0
  363. package/lib/typescript/web/utils.d.ts +0 -1
  364. package/lib/typescript/web/utils.js +233 -0
  365. package/lib/typescript/web_hammer/DiscreteGestureHandler.d.ts +0 -1
  366. package/lib/typescript/web_hammer/DiscreteGestureHandler.js +48 -0
  367. package/lib/typescript/web_hammer/DraggingGestureHandler.d.ts +0 -1
  368. package/lib/typescript/web_hammer/DraggingGestureHandler.js +25 -0
  369. package/lib/typescript/web_hammer/Errors.d.ts +0 -1
  370. package/lib/typescript/web_hammer/Errors.js +5 -0
  371. package/lib/typescript/web_hammer/FlingGestureHandler.d.ts +0 -1
  372. package/lib/typescript/web_hammer/FlingGestureHandler.js +119 -0
  373. package/lib/typescript/web_hammer/GestureHandler.d.ts +0 -1
  374. package/lib/typescript/web_hammer/GestureHandler.js +469 -0
  375. package/lib/typescript/web_hammer/IndiscreteGestureHandler.d.ts +0 -1
  376. package/lib/typescript/web_hammer/IndiscreteGestureHandler.js +26 -0
  377. package/lib/typescript/web_hammer/LongPressGestureHandler.d.ts +0 -1
  378. package/lib/typescript/web_hammer/LongPressGestureHandler.js +46 -0
  379. package/lib/typescript/web_hammer/NativeViewGestureHandler.d.ts +0 -1
  380. package/lib/typescript/web_hammer/NativeViewGestureHandler.js +40 -0
  381. package/lib/typescript/web_hammer/NodeManager.d.ts +0 -1
  382. package/lib/typescript/web_hammer/NodeManager.js +28 -0
  383. package/lib/typescript/web_hammer/PanGestureHandler.d.ts +0 -1
  384. package/lib/typescript/web_hammer/PanGestureHandler.js +151 -0
  385. package/lib/typescript/web_hammer/PinchGestureHandler.d.ts +0 -1
  386. package/lib/typescript/web_hammer/PinchGestureHandler.js +19 -0
  387. package/lib/typescript/web_hammer/PressGestureHandler.d.ts +0 -1
  388. package/lib/typescript/web_hammer/PressGestureHandler.js +133 -0
  389. package/lib/typescript/web_hammer/RotationGestureHandler.d.ts +0 -1
  390. package/lib/typescript/web_hammer/RotationGestureHandler.js +20 -0
  391. package/lib/typescript/web_hammer/TapGestureHandler.d.ts +0 -1
  392. package/lib/typescript/web_hammer/TapGestureHandler.js +142 -0
  393. package/lib/typescript/web_hammer/constants.d.ts +0 -1
  394. package/lib/typescript/web_hammer/constants.js +42 -0
  395. package/lib/typescript/web_hammer/utils.d.ts +0 -1
  396. package/lib/typescript/web_hammer/utils.js +15 -0
  397. package/package.json +4 -2
  398. package/src/components/Pressable/Pressable.tsx +357 -445
  399. package/src/components/Pressable/PressableProps.tsx +15 -0
  400. package/src/components/Pressable/StateMachine.tsx +49 -0
  401. package/src/components/Pressable/stateDefinitions.ts +125 -0
  402. package/src/components/Pressable/utils.ts +11 -7
  403. package/src/handlers/GestureHandlerEventPayload.ts +3 -0
  404. package/src/handlers/gestureHandlerTypesCompat.ts +9 -0
  405. package/src/handlers/gestures/forceTouchGesture.ts +9 -0
  406. package/src/handlers/gestures/gestureObjects.ts +3 -1
  407. package/src/web/detectors/RotationGestureDetector.ts +4 -0
  408. package/src/web/handlers/FlingGestureHandler.ts +4 -0
  409. package/src/web/handlers/GestureHandler.ts +9 -3
  410. package/src/web/handlers/PanGestureHandler.ts +25 -36
  411. package/src/web/handlers/TapGestureHandler.ts +14 -19
  412. package/src/web/tools/GestureHandlerOrchestrator.ts +1 -0
  413. package/src/web/tools/PointerEventManager.ts +1 -1
  414. package/src/web/tools/PointerTracker.ts +17 -15
  415. package/src/web/tools/Vector.ts +1 -1
@@ -1,15 +1,17 @@
1
1
  import React, {
2
- ForwardedRef,
3
- forwardRef,
4
- RefObject,
5
2
  useCallback,
3
+ useLayoutEffect,
6
4
  useMemo,
7
5
  useRef,
8
6
  useState,
9
7
  } from 'react';
10
8
  import { GestureObjects as Gesture } from '../../handlers/gestures/gestureObjects';
11
9
  import { GestureDetector } from '../../handlers/gestures/GestureDetector';
12
- import { PressableEvent, PressableProps } from './PressableProps';
10
+ import {
11
+ PressableEvent,
12
+ PressableProps,
13
+ PressableDimensions,
14
+ } from './PressableProps';
13
15
  import {
14
16
  Insets,
15
17
  Platform,
@@ -20,473 +22,383 @@ import {
20
22
  } from 'react-native';
21
23
  import NativeButton from '../GestureHandlerButton';
22
24
  import {
23
- numberAsInset,
24
25
  gestureToPressableEvent,
25
- isTouchWithinInset,
26
- gestureTouchToPressableEvent,
27
26
  addInsets,
27
+ numberAsInset,
28
+ gestureTouchToPressableEvent,
29
+ isTouchWithinInset,
28
30
  } from './utils';
29
31
  import { PressabilityDebugView } from '../../handlers/PressabilityDebugView';
30
- import { GestureTouchEvent } from '../../handlers/gestureHandlerCommon';
31
32
  import { INT32_MAX, isFabric, isTestEnv } from '../../utils';
32
33
  import {
33
34
  applyRelationProp,
34
35
  RelationPropName,
35
36
  RelationPropType,
36
37
  } from '../utils';
38
+ import {
39
+ getConfiguredStateMachine,
40
+ StateMachineEvent,
41
+ } from './stateDefinitions';
37
42
 
38
43
  const DEFAULT_LONG_PRESS_DURATION = 500;
39
44
  const IS_TEST_ENV = isTestEnv();
40
45
 
41
46
  let IS_FABRIC: null | boolean = null;
42
47
 
43
- const Pressable = forwardRef(
44
- (
45
- props: PressableProps,
46
- pressableRef: ForwardedRef<React.ComponentRef<typeof View>>
47
- ) => {
48
- const {
49
- testOnly_pressed,
50
- hitSlop,
51
- pressRetentionOffset,
52
- delayHoverIn,
53
- onHoverIn,
54
- delayHoverOut,
55
- onHoverOut,
56
- delayLongPress,
57
- unstable_pressDelay,
58
- onPress,
59
- onPressIn,
60
- onPressOut,
61
- onLongPress,
62
- style,
63
- children,
64
- android_disableSound,
65
- android_ripple,
66
- disabled,
67
- accessible,
68
- simultaneousWithExternalGesture,
69
- requireExternalGestureToFail,
70
- blocksExternalGesture,
71
- ...remainingProps
72
- } = props;
73
-
74
- const relationProps = {
75
- simultaneousWithExternalGesture,
76
- requireExternalGestureToFail,
77
- blocksExternalGesture,
78
- };
79
-
80
- const [pressedState, setPressedState] = useState(testOnly_pressed ?? false);
81
-
82
- // Disabled when onLongPress has been called
83
- const isPressCallbackEnabled = useRef<boolean>(true);
84
- const hasPassedBoundsChecks = useRef<boolean>(false);
85
- const shouldPreventNativeEffects = useRef<boolean>(false);
86
-
87
- const normalizedHitSlop: Insets = useMemo(
88
- () =>
89
- typeof hitSlop === 'number' ? numberAsInset(hitSlop) : (hitSlop ?? {}),
90
- [hitSlop]
91
- );
92
-
93
- const normalizedPressRetentionOffset: Insets = useMemo(
94
- () =>
95
- typeof pressRetentionOffset === 'number'
96
- ? numberAsInset(pressRetentionOffset)
97
- : (pressRetentionOffset ?? {}),
98
- [pressRetentionOffset]
99
- );
100
-
101
- const hoverInTimeout = useRef<number | null>(null);
102
- const hoverOutTimeout = useRef<number | null>(null);
103
-
104
- const hoverGesture = useMemo(
105
- () =>
106
- Gesture.Hover()
107
- .manualActivation(true) // Stops Hover from blocking Native gesture activation on web
108
- .cancelsTouchesInView(false)
109
- .onBegin((event) => {
110
- if (hoverOutTimeout.current) {
111
- clearTimeout(hoverOutTimeout.current);
112
- }
113
- if (delayHoverIn) {
114
- hoverInTimeout.current = setTimeout(
115
- () => onHoverIn?.(gestureToPressableEvent(event)),
116
- delayHoverIn
117
- );
118
- return;
119
- }
120
- onHoverIn?.(gestureToPressableEvent(event));
121
- })
122
- .onFinalize((event) => {
123
- if (hoverInTimeout.current) {
124
- clearTimeout(hoverInTimeout.current);
125
- }
126
- if (delayHoverOut) {
127
- hoverOutTimeout.current = setTimeout(
128
- () => onHoverOut?.(gestureToPressableEvent(event)),
129
- delayHoverOut
130
- );
131
- return;
132
- }
133
- onHoverOut?.(gestureToPressableEvent(event));
134
- }),
135
- [delayHoverIn, delayHoverOut, onHoverIn, onHoverOut]
136
- );
137
-
138
- const pressDelayTimeoutRef = useRef<number | null>(null);
139
- const isTouchPropagationAllowed = useRef<boolean>(false);
140
-
141
- // iOS only: due to varying flow of gestures, events sometimes have to be saved for later use
142
- const deferredEventPayload = useRef<PressableEvent | null>(null);
143
-
144
- const pressInHandler = useCallback(
145
- (event: PressableEvent) => {
146
- if (handlingOnTouchesDown.current) {
147
- deferredEventPayload.current = event;
148
- }
149
-
150
- if (!isTouchPropagationAllowed.current) {
151
- return;
152
- }
153
-
154
- deferredEventPayload.current = null;
155
-
156
- onPressIn?.(event);
157
- isPressCallbackEnabled.current = true;
158
- pressDelayTimeoutRef.current = null;
159
- setPressedState(true);
160
- },
161
- [onPressIn]
162
- );
163
-
164
- const pressOutHandler = useCallback(
165
- (event: PressableEvent) => {
166
- if (!isTouchPropagationAllowed.current) {
167
- hasPassedBoundsChecks.current = false;
168
- isPressCallbackEnabled.current = true;
169
- deferredEventPayload.current = null;
170
-
171
- if (longPressTimeoutRef.current) {
172
- clearTimeout(longPressTimeoutRef.current);
173
- longPressTimeoutRef.current = null;
174
- }
175
-
176
- if (pressDelayTimeoutRef.current) {
177
- clearTimeout(pressDelayTimeoutRef.current);
178
- pressDelayTimeoutRef.current = null;
179
- }
180
-
181
- return;
182
- }
183
-
184
- if (
185
- !hasPassedBoundsChecks.current ||
186
- event.nativeEvent.touches.length >
187
- event.nativeEvent.changedTouches.length
188
- ) {
189
- return;
190
- }
191
-
192
- if (unstable_pressDelay && pressDelayTimeoutRef.current !== null) {
193
- // When delay is preemptively finished by lifting touches,
194
- // we want to immediately activate it's effects - pressInHandler,
195
- // even though we are located at the pressOutHandler
196
- clearTimeout(pressDelayTimeoutRef.current);
197
- pressInHandler(event);
198
- }
199
-
200
- if (deferredEventPayload.current) {
201
- onPressIn?.(deferredEventPayload.current);
202
- deferredEventPayload.current = null;
203
- }
204
-
205
- onPressOut?.(event);
206
-
207
- if (isPressCallbackEnabled.current) {
208
- onPress?.(event);
209
- }
210
-
211
- if (longPressTimeoutRef.current) {
212
- clearTimeout(longPressTimeoutRef.current);
213
- longPressTimeoutRef.current = null;
214
- }
215
-
216
- isTouchPropagationAllowed.current = false;
217
- hasPassedBoundsChecks.current = false;
218
- isPressCallbackEnabled.current = true;
219
- setPressedState(false);
220
- },
221
- [onPress, onPressIn, onPressOut, pressInHandler, unstable_pressDelay]
222
- );
223
-
224
- const handlingOnTouchesDown = useRef<boolean>(false);
225
- const onEndHandlingTouchesDown = useRef<(() => void) | null>(null);
226
- const cancelledMidPress = useRef<boolean>(false);
227
-
228
- const activateLongPress = useCallback(
229
- (event: GestureTouchEvent) => {
230
- if (!isTouchPropagationAllowed.current) {
231
- return;
232
- }
233
-
234
- if (hasPassedBoundsChecks.current && onLongPress) {
235
- onLongPress(gestureTouchToPressableEvent(event));
236
- isPressCallbackEnabled.current = false;
237
- }
238
-
239
- if (longPressTimeoutRef.current) {
240
- clearTimeout(longPressTimeoutRef.current);
241
- longPressTimeoutRef.current = null;
242
- }
243
- },
244
- [onLongPress]
245
- );
246
-
247
- const longPressTimeoutRef = useRef<number | null>(null);
248
- const longPressMinDuration =
249
- (delayLongPress ?? DEFAULT_LONG_PRESS_DURATION) +
250
- (unstable_pressDelay ?? 0);
251
-
252
- const innerPressableRef = useRef<React.ComponentRef<typeof View>>(null);
253
-
254
- const measureCallback = useCallback(
255
- (width: number, height: number, event: GestureTouchEvent) => {
256
- if (
257
- !isTouchWithinInset(
258
- {
259
- width,
260
- height,
261
- },
262
- normalizedHitSlop,
263
- event.changedTouches.at(-1)
264
- ) ||
265
- hasPassedBoundsChecks.current ||
266
- cancelledMidPress.current
267
- ) {
268
- cancelledMidPress.current = false;
269
- onEndHandlingTouchesDown.current = null;
270
- handlingOnTouchesDown.current = false;
271
- return;
272
- }
273
-
274
- hasPassedBoundsChecks.current = true;
275
-
276
- // In case of multiple touches, the first one starts long press gesture
277
- if (longPressTimeoutRef.current === null) {
278
- // Start long press gesture timer
279
- longPressTimeoutRef.current = setTimeout(
280
- () => activateLongPress(event),
281
- longPressMinDuration
282
- );
283
- }
284
-
285
- if (unstable_pressDelay) {
286
- pressDelayTimeoutRef.current = setTimeout(() => {
287
- pressInHandler(gestureTouchToPressableEvent(event));
288
- }, unstable_pressDelay);
289
- } else {
290
- pressInHandler(gestureTouchToPressableEvent(event));
291
- }
292
-
293
- onEndHandlingTouchesDown.current?.();
294
- onEndHandlingTouchesDown.current = null;
295
- handlingOnTouchesDown.current = false;
296
- },
297
- [
298
- activateLongPress,
299
- longPressMinDuration,
300
- normalizedHitSlop,
301
- pressInHandler,
302
- unstable_pressDelay,
303
- ]
304
- );
305
-
306
- const pressAndTouchGesture = useMemo(
307
- () =>
308
- Gesture.LongPress()
309
- .minDuration(INT32_MAX) // Stops long press from blocking native gesture
310
- .maxDistance(INT32_MAX) // Stops long press from cancelling after set distance
311
- .cancelsTouchesInView(false)
312
- .onTouchesDown((event) => {
313
- handlingOnTouchesDown.current = true;
314
- if (pressableRef) {
315
- (
316
- pressableRef as RefObject<React.ComponentRef<typeof View>>
317
- ).current?.measure((_x, _y, width, height) => {
318
- measureCallback(width, height, event);
319
- });
320
- } else {
321
- innerPressableRef.current?.measure((_x, _y, width, height) => {
322
- measureCallback(width, height, event);
323
- });
324
- }
325
- })
326
- .onTouchesUp((event) => {
327
- if (handlingOnTouchesDown.current) {
328
- onEndHandlingTouchesDown.current = () =>
329
- pressOutHandler(gestureTouchToPressableEvent(event));
330
- return;
331
- }
332
- // On iOS, short taps will make LongPress gesture call onTouchesUp before Native gesture calls onStart
333
- // This variable ensures that onStart isn't detected as the first gesture since Pressable is pressed.
334
- if (deferredEventPayload.current !== null) {
335
- shouldPreventNativeEffects.current = true;
336
- }
337
- pressOutHandler(gestureTouchToPressableEvent(event));
338
- })
339
- .onTouchesCancelled((event) => {
340
- isPressCallbackEnabled.current = false;
341
-
342
- if (handlingOnTouchesDown.current) {
343
- cancelledMidPress.current = true;
344
- onEndHandlingTouchesDown.current = () =>
345
- pressOutHandler(gestureTouchToPressableEvent(event));
346
- return;
347
- }
348
-
349
- if (
350
- !hasPassedBoundsChecks.current ||
351
- event.allTouches.length > event.changedTouches.length
352
- ) {
353
- return;
354
- }
355
-
356
- pressOutHandler(gestureTouchToPressableEvent(event));
357
- }),
358
- [pressableRef, measureCallback, pressOutHandler]
359
- );
360
-
361
- // RNButton is placed inside ButtonGesture to enable Android's ripple and to capture non-propagating events
362
- const buttonGesture = useMemo(
363
- () =>
364
- Gesture.Native()
365
- .onBegin(() => {
366
- // Android sets BEGAN state on press down
367
- if (Platform.OS === 'android' || Platform.OS === 'macos') {
368
- isTouchPropagationAllowed.current = true;
369
- }
370
- })
371
- .onStart(() => {
372
- if (Platform.OS === 'web') {
373
- isTouchPropagationAllowed.current = true;
374
- }
375
-
376
- // iOS sets ACTIVE state on press down
377
- if (Platform.OS !== 'ios') {
378
- return;
379
- }
380
-
381
- if (deferredEventPayload.current) {
382
- isTouchPropagationAllowed.current = true;
383
-
384
- if (hasPassedBoundsChecks.current) {
385
- pressInHandler(deferredEventPayload.current);
386
- deferredEventPayload.current = null;
387
- } else {
388
- pressOutHandler(deferredEventPayload.current);
389
- isTouchPropagationAllowed.current = false;
390
- }
391
-
392
- return;
393
- }
394
-
395
- if (hasPassedBoundsChecks.current) {
396
- isTouchPropagationAllowed.current = true;
397
- return;
398
- }
399
-
400
- if (shouldPreventNativeEffects.current) {
401
- shouldPreventNativeEffects.current = false;
402
- if (!handlingOnTouchesDown.current) {
403
- return;
404
- }
405
- }
406
-
407
- isTouchPropagationAllowed.current = true;
408
- }),
409
- [pressInHandler, pressOutHandler]
410
- );
411
-
412
- const appliedHitSlop = addInsets(
413
- normalizedHitSlop,
414
- normalizedPressRetentionOffset
415
- );
416
-
417
- const isPressableEnabled = disabled !== true;
418
-
419
- const gestures = [buttonGesture, pressAndTouchGesture, hoverGesture];
420
-
421
- for (const gesture of gestures) {
422
- gesture.enabled(isPressableEnabled);
423
- gesture.runOnJS(true);
424
- gesture.hitSlop(appliedHitSlop);
425
- gesture.shouldCancelWhenOutside(Platform.OS === 'web' ? false : true);
426
-
427
- Object.entries(relationProps).forEach(([relationName, relation]) => {
428
- applyRelationProp(
429
- gesture,
430
- relationName as RelationPropName,
431
- relation as RelationPropType
432
- );
48
+ const Pressable = (props: PressableProps) => {
49
+ const {
50
+ ref,
51
+ testOnly_pressed,
52
+ hitSlop,
53
+ pressRetentionOffset,
54
+ delayHoverIn,
55
+ delayHoverOut,
56
+ delayLongPress,
57
+ unstable_pressDelay,
58
+ onHoverIn,
59
+ onHoverOut,
60
+ onPress,
61
+ onPressIn,
62
+ onPressOut,
63
+ onLongPress,
64
+ style,
65
+ children,
66
+ android_disableSound,
67
+ android_ripple,
68
+ disabled,
69
+ accessible,
70
+ simultaneousWithExternalGesture,
71
+ requireExternalGestureToFail,
72
+ blocksExternalGesture,
73
+ dimensionsAfterResize,
74
+ ...remainingProps
75
+ } = props;
76
+
77
+ const relationProps = {
78
+ simultaneousWithExternalGesture,
79
+ requireExternalGestureToFail,
80
+ blocksExternalGesture,
81
+ };
82
+
83
+ // used only if `ref` is undefined
84
+ const fallbackRef = useRef<View>(null);
85
+
86
+ const [pressedState, setPressedState] = useState(testOnly_pressed ?? false);
87
+
88
+ const longPressTimeoutRef = useRef<number | null>(null);
89
+ const pressDelayTimeoutRef = useRef<number | null>(null);
90
+ const isOnPressAllowed = useRef<boolean>(true);
91
+ const isCurrentlyPressed = useRef<boolean>(false);
92
+ const dimensions = useRef<PressableDimensions>({ width: 0, height: 0 });
93
+
94
+ const normalizedHitSlop: Insets = useMemo(
95
+ () =>
96
+ typeof hitSlop === 'number' ? numberAsInset(hitSlop) : (hitSlop ?? {}),
97
+ [hitSlop]
98
+ );
99
+
100
+ const normalizedPressRetentionOffset: Insets = useMemo(
101
+ () =>
102
+ typeof pressRetentionOffset === 'number'
103
+ ? numberAsInset(pressRetentionOffset)
104
+ : (pressRetentionOffset ?? {}),
105
+ [pressRetentionOffset]
106
+ );
107
+
108
+ const appliedHitSlop = addInsets(
109
+ normalizedHitSlop,
110
+ normalizedPressRetentionOffset
111
+ );
112
+
113
+ useLayoutEffect(() => {
114
+ if (dimensionsAfterResize) {
115
+ dimensions.current = dimensionsAfterResize;
116
+ } else {
117
+ requestAnimationFrame(() => {
118
+ (ref ?? fallbackRef).current?.measure((_x, _y, width, height) => {
119
+ dimensions.current = {
120
+ width,
121
+ height,
122
+ };
123
+ });
433
124
  });
434
125
  }
126
+ }, [dimensionsAfterResize, ref]);
435
127
 
436
- // Uses different hitSlop, to activate on hitSlop area instead of pressRetentionOffset area
437
- buttonGesture.hitSlop(normalizedHitSlop);
128
+ const cancelLongPress = useCallback(() => {
129
+ if (longPressTimeoutRef.current) {
130
+ clearTimeout(longPressTimeoutRef.current);
131
+ longPressTimeoutRef.current = null;
132
+ isOnPressAllowed.current = true;
133
+ }
134
+ }, []);
438
135
 
439
- const gesture = Gesture.Simultaneous(...gestures);
136
+ const cancelDelayedPress = useCallback(() => {
137
+ if (pressDelayTimeoutRef.current) {
138
+ clearTimeout(pressDelayTimeoutRef.current);
139
+ pressDelayTimeoutRef.current = null;
140
+ }
141
+ }, []);
142
+
143
+ const startLongPress = useCallback(
144
+ (event: PressableEvent) => {
145
+ if (onLongPress) {
146
+ cancelLongPress();
147
+ longPressTimeoutRef.current = setTimeout(() => {
148
+ isOnPressAllowed.current = false;
149
+ onLongPress(event);
150
+ }, delayLongPress ?? DEFAULT_LONG_PRESS_DURATION);
151
+ }
152
+ },
153
+ [onLongPress, cancelLongPress, delayLongPress]
154
+ );
155
+
156
+ const innerHandlePressIn = useCallback(
157
+ (event: PressableEvent) => {
158
+ onPressIn?.(event);
159
+ startLongPress(event);
160
+ setPressedState(true);
161
+ if (pressDelayTimeoutRef.current) {
162
+ clearTimeout(pressDelayTimeoutRef.current);
163
+ pressDelayTimeoutRef.current = null;
164
+ }
165
+ },
166
+ [onPressIn, startLongPress]
167
+ );
168
+
169
+ const handleFinalize = useCallback(() => {
170
+ isCurrentlyPressed.current = false;
171
+ cancelLongPress();
172
+ cancelDelayedPress();
173
+ setPressedState(false);
174
+ }, [cancelDelayedPress, cancelLongPress]);
175
+
176
+ const handlePressIn = useCallback(
177
+ (event: PressableEvent) => {
178
+ if (
179
+ !isTouchWithinInset(
180
+ dimensions.current,
181
+ normalizedHitSlop,
182
+ event.nativeEvent.changedTouches.at(-1)
183
+ )
184
+ ) {
185
+ // Ignoring pressIn within pressRetentionOffset
186
+ return;
187
+ }
440
188
 
441
- // `cursor: 'pointer'` on `RNButton` crashes iOS
442
- const pointerStyle: StyleProp<ViewStyle> =
443
- Platform.OS === 'web' ? { cursor: 'pointer' } : {};
189
+ isCurrentlyPressed.current = true;
190
+ if (unstable_pressDelay) {
191
+ pressDelayTimeoutRef.current = setTimeout(() => {
192
+ innerHandlePressIn(event);
193
+ }, unstable_pressDelay);
194
+ } else {
195
+ innerHandlePressIn(event);
196
+ }
197
+ },
198
+ [innerHandlePressIn, normalizedHitSlop, unstable_pressDelay]
199
+ );
200
+
201
+ const handlePressOut = useCallback(
202
+ (event: PressableEvent, success: boolean = true) => {
203
+ if (!isCurrentlyPressed.current) {
204
+ // Some prop configurations may lead to handlePressOut being called mutliple times.
205
+ return;
206
+ }
207
+
208
+ isCurrentlyPressed.current = false;
444
209
 
445
- const styleProp =
446
- typeof style === 'function' ? style({ pressed: pressedState }) : style;
210
+ if (pressDelayTimeoutRef.current) {
211
+ innerHandlePressIn(event);
212
+ }
447
213
 
448
- const childrenProp =
449
- typeof children === 'function'
450
- ? children({ pressed: pressedState })
451
- : children;
214
+ onPressOut?.(event);
452
215
 
453
- const rippleColor = useMemo(() => {
454
- if (IS_FABRIC === null) {
455
- IS_FABRIC = isFabric();
216
+ if (isOnPressAllowed.current && success) {
217
+ onPress?.(event);
456
218
  }
457
219
 
458
- const defaultRippleColor = android_ripple ? undefined : 'transparent';
459
- const unprocessedRippleColor =
460
- android_ripple?.color ?? defaultRippleColor;
461
- return IS_FABRIC
462
- ? unprocessedRippleColor
463
- : processColor(unprocessedRippleColor);
464
- }, [android_ripple]);
465
-
466
- return (
467
- <GestureDetector gesture={gesture}>
468
- <NativeButton
469
- {...remainingProps}
470
- ref={pressableRef ?? innerPressableRef}
471
- accessible={accessible !== false}
472
- hitSlop={appliedHitSlop}
473
- enabled={isPressableEnabled}
474
- touchSoundDisabled={android_disableSound ?? undefined}
475
- rippleColor={rippleColor}
476
- rippleRadius={android_ripple?.radius ?? undefined}
477
- style={[pointerStyle, styleProp]}
478
- testOnly_onPress={IS_TEST_ENV ? onPress : undefined}
479
- testOnly_onPressIn={IS_TEST_ENV ? onPressIn : undefined}
480
- testOnly_onPressOut={IS_TEST_ENV ? onPressOut : undefined}
481
- testOnly_onLongPress={IS_TEST_ENV ? onLongPress : undefined}>
482
- {childrenProp}
483
- {__DEV__ ? (
484
- <PressabilityDebugView color="red" hitSlop={normalizedHitSlop} />
485
- ) : null}
486
- </NativeButton>
487
- </GestureDetector>
488
- );
220
+ handleFinalize();
221
+ },
222
+ [handleFinalize, innerHandlePressIn, onPress, onPressOut]
223
+ );
224
+
225
+ const stateMachine = useMemo(
226
+ () => getConfiguredStateMachine(handlePressIn, handlePressOut),
227
+ [handlePressIn, handlePressOut]
228
+ );
229
+
230
+ const hoverInTimeout = useRef<number | null>(null);
231
+ const hoverOutTimeout = useRef<number | null>(null);
232
+
233
+ const hoverGesture = useMemo(
234
+ () =>
235
+ Gesture.Hover()
236
+ .manualActivation(true) // Prevents Hover blocking Gesture.Native() on web
237
+ .cancelsTouchesInView(false)
238
+ .onBegin((event) => {
239
+ if (hoverOutTimeout.current) {
240
+ clearTimeout(hoverOutTimeout.current);
241
+ }
242
+ if (delayHoverIn) {
243
+ hoverInTimeout.current = setTimeout(
244
+ () => onHoverIn?.(gestureToPressableEvent(event)),
245
+ delayHoverIn
246
+ );
247
+ return;
248
+ }
249
+ onHoverIn?.(gestureToPressableEvent(event));
250
+ })
251
+ .onFinalize((event) => {
252
+ if (hoverInTimeout.current) {
253
+ clearTimeout(hoverInTimeout.current);
254
+ }
255
+ if (delayHoverOut) {
256
+ hoverOutTimeout.current = setTimeout(
257
+ () => onHoverOut?.(gestureToPressableEvent(event)),
258
+ delayHoverOut
259
+ );
260
+ return;
261
+ }
262
+ onHoverOut?.(gestureToPressableEvent(event));
263
+ }),
264
+ [delayHoverIn, delayHoverOut, onHoverIn, onHoverOut]
265
+ );
266
+
267
+ const pressAndTouchGesture = useMemo(
268
+ () =>
269
+ Gesture.LongPress()
270
+ .minDuration(INT32_MAX) // Stops long press from blocking Gesture.Native()
271
+ .maxDistance(INT32_MAX) // Stops long press from cancelling on touch move
272
+ .cancelsTouchesInView(false)
273
+ .onTouchesDown((event) => {
274
+ const pressableEvent = gestureTouchToPressableEvent(event);
275
+ stateMachine.handleEvent(
276
+ StateMachineEvent.LONG_PRESS_TOUCHES_DOWN,
277
+ pressableEvent
278
+ );
279
+ })
280
+ .onTouchesUp(() => {
281
+ if (Platform.OS === 'android') {
282
+ // Prevents potential soft-locks
283
+ stateMachine.reset();
284
+ handleFinalize();
285
+ }
286
+ })
287
+ .onTouchesCancelled((event) => {
288
+ const pressableEvent = gestureTouchToPressableEvent(event);
289
+ stateMachine.reset();
290
+ handlePressOut(pressableEvent, false);
291
+ })
292
+ .onFinalize(() => {
293
+ if (Platform.OS === 'web') {
294
+ stateMachine.handleEvent(StateMachineEvent.FINALIZE);
295
+ handleFinalize();
296
+ }
297
+ }),
298
+ [stateMachine, handleFinalize, handlePressOut]
299
+ );
300
+
301
+ // RNButton is placed inside ButtonGesture to enable Android's ripple and to capture non-propagating events
302
+ const buttonGesture = useMemo(
303
+ () =>
304
+ Gesture.Native()
305
+ .onTouchesCancelled((event) => {
306
+ if (Platform.OS !== 'macos' && Platform.OS !== 'web') {
307
+ // On MacOS cancel occurs in middle of gesture
308
+ // On Web cancel occurs on mouse move, which is unwanted
309
+ const pressableEvent = gestureTouchToPressableEvent(event);
310
+ stateMachine.reset();
311
+ handlePressOut(pressableEvent, false);
312
+ }
313
+ })
314
+ .onBegin(() => {
315
+ stateMachine.handleEvent(StateMachineEvent.NATIVE_BEGIN);
316
+ })
317
+ .onStart(() => {
318
+ if (Platform.OS !== 'android') {
319
+ // Gesture.Native().onStart() is broken with Android + hitSlop
320
+ stateMachine.handleEvent(StateMachineEvent.NATIVE_START);
321
+ }
322
+ })
323
+ .onFinalize(() => {
324
+ if (Platform.OS !== 'web') {
325
+ // On Web we use LongPress().onFinalize() instead of Native().onFinalize(),
326
+ // as Native cancels on mouse move, and LongPress does not.
327
+ stateMachine.handleEvent(StateMachineEvent.FINALIZE);
328
+ handleFinalize();
329
+ }
330
+ }),
331
+ [stateMachine, handlePressOut, handleFinalize]
332
+ );
333
+
334
+ const isPressableEnabled = disabled !== true;
335
+
336
+ const gestures = [buttonGesture, pressAndTouchGesture, hoverGesture];
337
+
338
+ for (const gesture of gestures) {
339
+ gesture.enabled(isPressableEnabled);
340
+ gesture.runOnJS(true);
341
+ gesture.hitSlop(appliedHitSlop);
342
+ gesture.shouldCancelWhenOutside(Platform.OS !== 'web');
343
+
344
+ Object.entries(relationProps).forEach(([relationName, relation]) => {
345
+ applyRelationProp(
346
+ gesture,
347
+ relationName as RelationPropName,
348
+ relation as RelationPropType
349
+ );
350
+ });
489
351
  }
490
- );
352
+
353
+ const gesture = Gesture.Simultaneous(...gestures);
354
+
355
+ // `cursor: 'pointer'` on `RNButton` crashes iOS
356
+ const pointerStyle: StyleProp<ViewStyle> =
357
+ Platform.OS === 'web' ? { cursor: 'pointer' } : {};
358
+
359
+ const styleProp =
360
+ typeof style === 'function' ? style({ pressed: pressedState }) : style;
361
+
362
+ const childrenProp =
363
+ typeof children === 'function'
364
+ ? children({ pressed: pressedState })
365
+ : children;
366
+
367
+ const rippleColor = useMemo(() => {
368
+ if (IS_FABRIC === null) {
369
+ IS_FABRIC = isFabric();
370
+ }
371
+
372
+ const defaultRippleColor = android_ripple ? undefined : 'transparent';
373
+ const unprocessedRippleColor = android_ripple?.color ?? defaultRippleColor;
374
+ return IS_FABRIC
375
+ ? unprocessedRippleColor
376
+ : processColor(unprocessedRippleColor);
377
+ }, [android_ripple]);
378
+
379
+ return (
380
+ <GestureDetector gesture={gesture}>
381
+ <NativeButton
382
+ {...remainingProps}
383
+ ref={ref ?? fallbackRef}
384
+ accessible={accessible !== false}
385
+ hitSlop={appliedHitSlop}
386
+ enabled={isPressableEnabled}
387
+ touchSoundDisabled={android_disableSound ?? undefined}
388
+ rippleColor={rippleColor}
389
+ rippleRadius={android_ripple?.radius ?? undefined}
390
+ style={[pointerStyle, styleProp]}
391
+ testOnly_onPress={IS_TEST_ENV ? onPress : undefined}
392
+ testOnly_onPressIn={IS_TEST_ENV ? onPressIn : undefined}
393
+ testOnly_onPressOut={IS_TEST_ENV ? onPressOut : undefined}
394
+ testOnly_onLongPress={IS_TEST_ENV ? onLongPress : undefined}>
395
+ {childrenProp}
396
+ {__DEV__ ? (
397
+ <PressabilityDebugView color="red" hitSlop={normalizedHitSlop} />
398
+ ) : null}
399
+ </NativeButton>
400
+ </GestureDetector>
401
+ );
402
+ };
491
403
 
492
404
  export default Pressable;