react-native-gesture-handler 2.6.1 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. package/android/build.gradle +0 -8
  2. package/android/gradle.properties +1 -1
  3. package/android/lib/src/main/java/com/swmansion/gesturehandler/FlingGestureHandler.kt +7 -7
  4. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.kt +46 -26
  5. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.kt +76 -29
  6. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureUtils.kt +4 -6
  7. package/android/lib/src/main/java/com/swmansion/gesturehandler/LongPressGestureHandler.kt +6 -6
  8. package/android/lib/src/main/java/com/swmansion/gesturehandler/ManualGestureHandler.kt +1 -1
  9. package/android/lib/src/main/java/com/swmansion/gesturehandler/NativeViewGestureHandler.kt +1 -1
  10. package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.kt +11 -11
  11. package/android/lib/src/main/java/com/swmansion/gesturehandler/PinchGestureHandler.kt +17 -9
  12. package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureHandler.kt +15 -8
  13. package/android/lib/src/main/java/com/swmansion/gesturehandler/TapGestureHandler.kt +10 -10
  14. package/android/noreanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt +1 -1
  15. package/android/reanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt +1 -1
  16. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +31 -12
  17. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +2 -2
  18. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +1 -1
  19. package/ios/RNGestureHandlerButtonComponentView.mm +4 -4
  20. package/lib/commonjs/RNGestureHandlerModule.macos.js +2 -4
  21. package/lib/commonjs/RNGestureHandlerModule.macos.js.map +1 -1
  22. package/lib/commonjs/components/GestureComponents.js +6 -4
  23. package/lib/commonjs/components/GestureComponents.js.map +1 -1
  24. package/lib/commonjs/components/Swipeable.js +4 -4
  25. package/lib/commonjs/components/Swipeable.js.map +1 -1
  26. package/lib/commonjs/handlers/gestures/GestureDetector.js +4 -2
  27. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  28. package/lib/commonjs/utils.js +10 -6
  29. package/lib/commonjs/utils.js.map +1 -1
  30. package/lib/commonjs/web/handlers/GestureHandler.js +48 -0
  31. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  32. package/lib/commonjs/web/tools/PointerTracker.js +2 -2
  33. package/lib/commonjs/web/tools/PointerTracker.js.map +1 -1
  34. package/lib/module/RNGestureHandlerModule.macos.js +2 -4
  35. package/lib/module/RNGestureHandlerModule.macos.js.map +1 -1
  36. package/lib/module/components/GestureComponents.js +6 -4
  37. package/lib/module/components/GestureComponents.js.map +1 -1
  38. package/lib/module/components/Swipeable.js +4 -4
  39. package/lib/module/components/Swipeable.js.map +1 -1
  40. package/lib/module/handlers/gestures/GestureDetector.js +5 -3
  41. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  42. package/lib/module/utils.js +7 -6
  43. package/lib/module/utils.js.map +1 -1
  44. package/lib/module/web/handlers/GestureHandler.js +48 -0
  45. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  46. package/lib/module/web/tools/PointerTracker.js +2 -2
  47. package/lib/module/web/tools/PointerTracker.js.map +1 -1
  48. package/lib/typescript/RNGestureHandlerModule.macos.d.ts +1 -1
  49. package/lib/typescript/components/Swipeable.d.ts +3 -3
  50. package/lib/typescript/utils.d.ts +4 -0
  51. package/lib/typescript/web/handlers/GestureHandler.d.ts +1 -0
  52. package/package.json +4 -8
  53. package/src/RNGestureHandlerModule.macos.ts +3 -3
  54. package/src/components/GestureComponents.tsx +12 -16
  55. package/src/components/Swipeable.tsx +11 -7
  56. package/src/handlers/gestures/GestureDetector.tsx +8 -3
  57. package/src/utils.ts +6 -6
  58. package/src/web/handlers/GestureHandler.ts +60 -0
  59. package/src/web/tools/PointerTracker.ts +2 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["PointerTracker.ts"],"names":["VELOCITY_FACTOR","MAX_POINTERS","PointerTracker","constructor","Map","x","y","lastMovedPointerId","NaN","i","touchEventsIds","set","addToTracker","event","trackedPointers","has","pointerId","newElement","lastX","lastY","timeStamp","time","velocityX","velocityY","mapTouchEventId","cachedAverages","getLastAvgX","getLastAvgY","removeFromTracker","delete","removeMappedTouchId","track","element","get","dx","dy","dt","avgX","avgY","id","mappedId","touchId","isNaN","getMappedTouchEventId","touchEventId","key","value","entries","getVelocityX","getVelocityY","getLastX","getLastY","getSumX","size","getSumY","ignoredPointer","sumX","forEach","sumY","getTrackedPointersCount","getTrackedPointersID","keys","_value","push","getData","resetTracker","clear","shareCommonPointers","stPointers","ndPointers","some","includes"],"mappings":";;AAYA;AACA,MAAMA,eAAe,GAAG,GAAxB;AACA,MAAMC,YAAY,GAAG,EAArB;AAEA,eAAe,MAAMC,cAAN,CAAqB;AAY3BC,EAAAA,WAAW,GAAG;AAAA,6CAXkC,IAAIC,GAAJ,EAWlC;;AAAA,4CANyB,IAAIA,GAAJ,EAMzB;;AAAA;;AAAA,4CAF8B;AAAEC,MAAAA,CAAC,EAAE,CAAL;AAAQC,MAAAA,CAAC,EAAE;AAAX,KAE9B;;AACnB,SAAKC,kBAAL,GAA0BC,GAA1B;;AAEA,SAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGR,YAApB,EAAkC,EAAEQ,CAApC,EAAuC;AACrC,WAAKC,cAAL,CAAoBC,GAApB,CAAwBF,CAAxB,EAA2BD,GAA3B;AACD;AACF;;AAEMI,EAAAA,YAAY,CAACC,KAAD,EAA4B;AAC7C,QAAI,KAAKC,eAAL,CAAqBC,GAArB,CAAyBF,KAAK,CAACG,SAA/B,CAAJ,EAA+C;AAC7C;AACD;;AAED,SAAKT,kBAAL,GAA0BM,KAAK,CAACG,SAAhC;AAEA,UAAMC,UAA0B,GAAG;AACjCC,MAAAA,KAAK,EAAEL,KAAK,CAACR,CADoB;AAEjCc,MAAAA,KAAK,EAAEN,KAAK,CAACP,CAFoB;AAGjCc,MAAAA,SAAS,EAAEP,KAAK,CAACQ,IAHgB;AAIjCC,MAAAA,SAAS,EAAE,CAJsB;AAKjCC,MAAAA,SAAS,EAAE;AALsB,KAAnC;AAQA,SAAKT,eAAL,CAAqBH,GAArB,CAAyBE,KAAK,CAACG,SAA/B,EAA0CC,UAA1C;AACA,SAAKO,eAAL,CAAqBX,KAAK,CAACG,SAA3B;AAEA,SAAKS,cAAL,GAAsB;AACpBpB,MAAAA,CAAC,EAAE,KAAKqB,WAAL,EADiB;AAEpBpB,MAAAA,CAAC,EAAE,KAAKqB,WAAL;AAFiB,KAAtB;AAID;;AAEMC,EAAAA,iBAAiB,CAACZ,SAAD,EAA0B;AAChD,SAAKF,eAAL,CAAqBe,MAArB,CAA4Bb,SAA5B;AACA,SAAKc,mBAAL,CAAyBd,SAAzB;AACD;;AAEMe,EAAAA,KAAK,CAAClB,KAAD,EAA4B;AACtC,UAAMmB,OAAuB,GAAG,KAAKlB,eAAL,CAAqBmB,GAArB,CAC9BpB,KAAK,CAACG,SADwB,CAAhC;;AAIA,QAAI,CAACgB,OAAL,EAAc;AACZ;AACD;;AAED,SAAKzB,kBAAL,GAA0BM,KAAK,CAACG,SAAhC;AAEA,UAAMkB,EAAE,GAAGrB,KAAK,CAACR,CAAN,GAAU2B,OAAO,CAACd,KAA7B;AACA,UAAMiB,EAAE,GAAGtB,KAAK,CAACP,CAAN,GAAU0B,OAAO,CAACb,KAA7B;AACA,UAAMiB,EAAE,GAAGvB,KAAK,CAACQ,IAAN,GAAaW,OAAO,CAACZ,SAAhC;AAEAY,IAAAA,OAAO,CAACV,SAAR,GAAqBY,EAAE,GAAGE,EAAN,GAAY,IAAZ,GAAmBpC,eAAvC;AACAgC,IAAAA,OAAO,CAACT,SAAR,GAAqBY,EAAE,GAAGC,EAAN,GAAY,IAAZ,GAAmBpC,eAAvC;AAEAgC,IAAAA,OAAO,CAACd,KAAR,GAAgBL,KAAK,CAACR,CAAtB;AACA2B,IAAAA,OAAO,CAACb,KAAR,GAAgBN,KAAK,CAACP,CAAtB;AAEA,SAAKQ,eAAL,CAAqBH,GAArB,CAAyBE,KAAK,CAACG,SAA/B,EAA0CgB,OAA1C;AAEA,UAAMK,IAAY,GAAG,KAAKX,WAAL,EAArB;AACA,UAAMY,IAAY,GAAG,KAAKX,WAAL,EAArB;AAEA,SAAKF,cAAL,GAAsB;AACpBpB,MAAAA,CAAC,EAAEgC,IADiB;AAEpB/B,MAAAA,CAAC,EAAEgC;AAFiB,KAAtB;AAID,GA/EiC,CAiFlC;;;AACQd,EAAAA,eAAe,CAACe,EAAD,EAAmB;AACxC,SAAK,MAAM,CAACC,QAAD,EAAWC,OAAX,CAAX,IAAkC,KAAK/B,cAAvC,EAAuD;AACrD,UAAIgC,KAAK,CAACD,OAAD,CAAT,EAAoB;AAClB,aAAK/B,cAAL,CAAoBC,GAApB,CAAwB6B,QAAxB,EAAkCD,EAAlC;AACA;AACD;AACF;AACF;;AAEOT,EAAAA,mBAAmB,CAACS,EAAD,EAAmB;AAC5C,UAAMC,QAAgB,GAAG,KAAKG,qBAAL,CAA2BJ,EAA3B,CAAzB;;AACA,QAAI,CAACG,KAAK,CAACF,QAAD,CAAV,EAAsB;AACpB,WAAK9B,cAAL,CAAoBC,GAApB,CAAwB6B,QAAxB,EAAkChC,GAAlC;AACD;AACF;;AAEMmC,EAAAA,qBAAqB,CAACC,YAAD,EAA+B;AACzD,SAAK,MAAM,CAACC,GAAD,EAAMC,KAAN,CAAX,IAA2B,KAAKpC,cAAL,CAAoBqC,OAApB,EAA3B,EAA0D;AACxD,UAAID,KAAK,KAAKF,YAAd,EAA4B;AAC1B,eAAOC,GAAP;AACD;AACF;;AAED,WAAOrC,GAAP;AACD;;AAEMwC,EAAAA,YAAY,CAAChC,SAAD,EAA4B;AAAA;;AAC7C,oCAAO,KAAKF,eAAL,CAAqBmB,GAArB,CAAyBjB,SAAzB,CAAP,0DAAO,sBAAqCM,SAA5C;AACD;;AACM2B,EAAAA,YAAY,CAACjC,SAAD,EAA4B;AAAA;;AAC7C,qCAAO,KAAKF,eAAL,CAAqBmB,GAArB,CAAyBjB,SAAzB,CAAP,2DAAO,uBAAqCO,SAA5C;AACD;AAED;AACF;AACA;;;AAWS2B,EAAAA,QAAQ,CAAClC,SAAD,EAA6B;AAC1C,QAAIA,SAAJ,EAAe;AAAA;;AACb,uCAAO,KAAKF,eAAL,CAAqBmB,GAArB,CAAyBjB,SAAzB,CAAP,2DAAO,uBAAqCE,KAA5C;AACD,KAFD,MAEO;AAAA;;AACL,uCAAO,KAAKJ,eAAL,CAAqBmB,GAArB,CAAyB,KAAK1B,kBAA9B,CAAP,2DAAO,uBAAmDW,KAA1D;AACD;AACF;AAED;AACF;AACA;;;AAWSiC,EAAAA,QAAQ,CAACnC,SAAD,EAA6B;AAC1C,QAAIA,SAAJ,EAAe;AAAA;;AACb,uCAAO,KAAKF,eAAL,CAAqBmB,GAArB,CAAyBjB,SAAzB,CAAP,2DAAO,uBAAqCG,KAA5C;AACD,KAFD,MAEO;AAAA;;AACL,uCAAO,KAAKL,eAAL,CAAqBmB,GAArB,CAAyB,KAAK1B,kBAA9B,CAAP,2DAAO,uBAAmDY,KAA1D;AACD;AACF,GA3JiC,CA6JlC;AACA;AACA;AACA;;;AACOO,EAAAA,WAAW,GAAW;AAC3B,UAAMW,IAAY,GAAG,KAAKe,OAAL,KAAiB,KAAKtC,eAAL,CAAqBuC,IAA3D;AACA,WAAOX,KAAK,CAACL,IAAD,CAAL,GAAc,KAAKZ,cAAL,CAAoBpB,CAAlC,GAAsCgC,IAA7C;AACD;;AACMV,EAAAA,WAAW,GAAW;AAC3B,UAAMW,IAAY,GAAG,KAAKgB,OAAL,KAAiB,KAAKxC,eAAL,CAAqBuC,IAA3D;AACA,WAAOX,KAAK,CAACJ,IAAD,CAAL,GAAc,KAAKb,cAAL,CAAoBnB,CAAlC,GAAsCgC,IAA7C;AACD;;AACMc,EAAAA,OAAO,CAACG,cAAD,EAAkC;AAC9C,QAAIC,IAAI,GAAG,CAAX;AAEA,SAAK1C,eAAL,CAAqB2C,OAArB,CAA6B,CAACX,KAAD,EAAQD,GAAR,KAAgB;AAC3C,UAAIA,GAAG,KAAKU,cAAZ,EAA4B;AAC1BC,QAAAA,IAAI,IAAIV,KAAK,CAAC5B,KAAd;AACD;AACF,KAJD;AAMA,WAAOsC,IAAP;AACD;;AACMF,EAAAA,OAAO,CAACC,cAAD,EAAkC;AAC9C,QAAIG,IAAI,GAAG,CAAX;AAEA,SAAK5C,eAAL,CAAqB2C,OAArB,CAA6B,CAACX,KAAD,EAAQD,GAAR,KAAgB;AAC3C,UAAIA,GAAG,KAAKU,cAAZ,EAA4B;AAC1BG,QAAAA,IAAI,IAAIZ,KAAK,CAAC3B,KAAd;AACD;AACF,KAJD;AAMA,WAAOuC,IAAP;AACD;;AACMC,EAAAA,uBAAuB,GAAW;AACvC,WAAO,KAAK7C,eAAL,CAAqBuC,IAA5B;AACD;;AACMO,EAAAA,oBAAoB,GAAa;AACtC,UAAMC,IAAc,GAAG,EAAvB;AAEA,SAAK/C,eAAL,CAAqB2C,OAArB,CAA6B,CAACK,MAAD,EAASjB,GAAT,KAAiB;AAC5CgB,MAAAA,IAAI,CAACE,IAAL,CAAUlB,GAAV;AACD,KAFD;AAIA,WAAOgB,IAAP;AACD;;AAEMG,EAAAA,OAAO,GAAgC;AAC5C,WAAO,KAAKlD,eAAZ;AACD;;AAEMmD,EAAAA,YAAY,GAAS;AAC1B,SAAKnD,eAAL,CAAqBoD,KAArB;AACA,SAAK3D,kBAAL,GAA0BC,GAA1B;;AAEA,SAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGR,YAApB,EAAkC,EAAEQ,CAApC,EAAuC;AACrC,WAAKC,cAAL,CAAoBC,GAApB,CAAwBF,CAAxB,EAA2BD,GAA3B;AACD;AACF;;AAEgC,SAAnB2D,mBAAmB,CAC/BC,UAD+B,EAE/BC,UAF+B,EAGtB;AACT,WAAOD,UAAU,CAACE,IAAX,CAAiBtD,SAAD,IAAeqD,UAAU,CAACE,QAAX,CAAoBvD,SAApB,CAA/B,CAAP;AACD;;AA9NiC","sourcesContent":["import { AdaptedEvent } from '../interfaces';\n\nexport interface TrackerElement {\n lastX: number;\n lastY: number;\n\n timeStamp: number;\n\n velocityX: number;\n velocityY: number;\n}\n\n// Used to scale velocity so that it is similar to velocity in Android/iOS\nconst VELOCITY_FACTOR = 0.2;\nconst MAX_POINTERS = 20;\n\nexport default class PointerTracker {\n private trackedPointers: Map<number, TrackerElement> = new Map<\n number,\n TrackerElement\n >();\n\n private touchEventsIds: Map<number, number> = new Map<number, number>();\n\n private lastMovedPointerId: number;\n\n private cachedAverages: { x: number; y: number } = { x: 0, y: 0 };\n\n public constructor() {\n this.lastMovedPointerId = NaN;\n\n for (let i = 0; i < MAX_POINTERS; ++i) {\n this.touchEventsIds.set(i, NaN);\n }\n }\n\n public addToTracker(event: AdaptedEvent): void {\n if (this.trackedPointers.has(event.pointerId)) {\n return;\n }\n\n this.lastMovedPointerId = event.pointerId;\n\n const newElement: TrackerElement = {\n lastX: event.x,\n lastY: event.y,\n timeStamp: event.time,\n velocityX: 0,\n velocityY: 0,\n };\n\n this.trackedPointers.set(event.pointerId, newElement);\n this.mapTouchEventId(event.pointerId);\n\n this.cachedAverages = {\n x: this.getLastAvgX(),\n y: this.getLastAvgY(),\n };\n }\n\n public removeFromTracker(pointerId: number): void {\n this.trackedPointers.delete(pointerId);\n this.removeMappedTouchId(pointerId);\n }\n\n public track(event: AdaptedEvent): void {\n const element: TrackerElement = this.trackedPointers.get(\n event.pointerId\n ) as TrackerElement;\n\n if (!element) {\n return;\n }\n\n this.lastMovedPointerId = event.pointerId;\n\n const dx = event.x - element.lastX;\n const dy = event.y - element.lastY;\n const dt = event.time - element.timeStamp;\n\n element.velocityX = (dx / dt) * 1000 * VELOCITY_FACTOR;\n element.velocityY = (dy / dt) * 1000 * VELOCITY_FACTOR;\n\n element.lastX = event.x;\n element.lastY = event.y;\n\n this.trackedPointers.set(event.pointerId, element);\n\n const avgX: number = this.getLastAvgX();\n const avgY: number = this.getLastAvgY();\n\n this.cachedAverages = {\n x: avgX,\n y: avgY,\n };\n }\n\n //Mapping TouchEvents ID\n private mapTouchEventId(id: number): void {\n for (const [mappedId, touchId] of this.touchEventsIds) {\n if (isNaN(touchId)) {\n this.touchEventsIds.set(mappedId, id);\n break;\n }\n }\n }\n\n private removeMappedTouchId(id: number): void {\n const mappedId: number = this.getMappedTouchEventId(id);\n if (!isNaN(mappedId)) {\n this.touchEventsIds.set(mappedId, NaN);\n }\n }\n\n public getMappedTouchEventId(touchEventId: number): number {\n for (const [key, value] of this.touchEventsIds.entries()) {\n if (value === touchEventId) {\n return key;\n }\n }\n\n return NaN;\n }\n\n public getVelocityX(pointerId: number): number {\n return this.trackedPointers.get(pointerId)?.velocityX as number;\n }\n public getVelocityY(pointerId: number): number {\n return this.trackedPointers.get(pointerId)?.velocityY as number;\n }\n\n /**\n * Returns X coordinate of last moved pointer\n */\n public getLastX(): number;\n\n /**\n *\n * @param pointerId\n * Returns X coordinate of given pointer\n */\n // eslint-disable-next-line @typescript-eslint/unified-signatures\n public getLastX(pointerId: number): number;\n\n public getLastX(pointerId?: number): number {\n if (pointerId) {\n return this.trackedPointers.get(pointerId)?.lastX as number;\n } else {\n return this.trackedPointers.get(this.lastMovedPointerId)?.lastX as number;\n }\n }\n\n /**\n * Returns Y coordinate of last moved pointer\n */\n public getLastY(): number;\n\n /**\n *\n * @param pointerId\n * Returns Y coordinate of given pointer\n */\n // eslint-disable-next-line @typescript-eslint/unified-signatures\n public getLastY(pointerId: number): number;\n\n public getLastY(pointerId?: number): number {\n if (pointerId) {\n return this.trackedPointers.get(pointerId)?.lastY as number;\n } else {\n return this.trackedPointers.get(this.lastMovedPointerId)?.lastY as number;\n }\n }\n\n // Some handlers use these methods to send average values in native event.\n // This may happen when pointers have already been removed from tracker (i.e. pointerup event).\n // In situation when NaN would be sent as a response, we return cached value.\n // That prevents handlers from crashing\n public getLastAvgX(): number {\n const avgX: number = this.getSumX() / this.trackedPointers.size;\n return isNaN(avgX) ? this.cachedAverages.x : avgX;\n }\n public getLastAvgY(): number {\n const avgY: number = this.getSumY() / this.trackedPointers.size;\n return isNaN(avgY) ? this.cachedAverages.y : avgY;\n }\n public getSumX(ignoredPointer?: number): number {\n let sumX = 0;\n\n this.trackedPointers.forEach((value, key) => {\n if (key !== ignoredPointer) {\n sumX += value.lastX;\n }\n });\n\n return sumX;\n }\n public getSumY(ignoredPointer?: number): number {\n let sumY = 0;\n\n this.trackedPointers.forEach((value, key) => {\n if (key !== ignoredPointer) {\n sumY += value.lastY;\n }\n });\n\n return sumY;\n }\n public getTrackedPointersCount(): number {\n return this.trackedPointers.size;\n }\n public getTrackedPointersID(): number[] {\n const keys: number[] = [];\n\n this.trackedPointers.forEach((_value, key) => {\n keys.push(key);\n });\n\n return keys;\n }\n\n public getData(): Map<number, TrackerElement> {\n return this.trackedPointers;\n }\n\n public resetTracker(): void {\n this.trackedPointers.clear();\n this.lastMovedPointerId = NaN;\n\n for (let i = 0; i < MAX_POINTERS; ++i) {\n this.touchEventsIds.set(i, NaN);\n }\n }\n\n public static shareCommonPointers(\n stPointers: number[],\n ndPointers: number[]\n ): boolean {\n return stPointers.some((pointerId) => ndPointers.includes(pointerId));\n }\n}\n"]}
1
+ {"version":3,"sources":["PointerTracker.ts"],"names":["VELOCITY_FACTOR","MAX_POINTERS","PointerTracker","constructor","Map","x","y","lastMovedPointerId","NaN","i","touchEventsIds","set","addToTracker","event","trackedPointers","has","pointerId","newElement","lastX","lastY","timeStamp","time","velocityX","velocityY","mapTouchEventId","cachedAverages","getLastAvgX","getLastAvgY","removeFromTracker","delete","removeMappedTouchId","track","element","get","dx","dy","dt","avgX","avgY","id","mappedId","touchId","isNaN","getMappedTouchEventId","touchEventId","key","value","entries","getVelocityX","getVelocityY","getLastX","undefined","getLastY","getSumX","size","getSumY","ignoredPointer","sumX","forEach","sumY","getTrackedPointersCount","getTrackedPointersID","keys","_value","push","getData","resetTracker","clear","shareCommonPointers","stPointers","ndPointers","some","includes"],"mappings":"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","sourcesContent":["import { AdaptedEvent } from '../interfaces';\n\nexport interface TrackerElement {\n lastX: number;\n lastY: number;\n\n timeStamp: number;\n\n velocityX: number;\n velocityY: number;\n}\n\n// Used to scale velocity so that it is similar to velocity in Android/iOS\nconst VELOCITY_FACTOR = 0.2;\nconst MAX_POINTERS = 20;\n\nexport default class PointerTracker {\n private trackedPointers: Map<number, TrackerElement> = new Map<\n number,\n TrackerElement\n >();\n\n private touchEventsIds: Map<number, number> = new Map<number, number>();\n\n private lastMovedPointerId: number;\n\n private cachedAverages: { x: number; y: number } = { x: 0, y: 0 };\n\n public constructor() {\n this.lastMovedPointerId = NaN;\n\n for (let i = 0; i < MAX_POINTERS; ++i) {\n this.touchEventsIds.set(i, NaN);\n }\n }\n\n public addToTracker(event: AdaptedEvent): void {\n if (this.trackedPointers.has(event.pointerId)) {\n return;\n }\n\n this.lastMovedPointerId = event.pointerId;\n\n const newElement: TrackerElement = {\n lastX: event.x,\n lastY: event.y,\n timeStamp: event.time,\n velocityX: 0,\n velocityY: 0,\n };\n\n this.trackedPointers.set(event.pointerId, newElement);\n this.mapTouchEventId(event.pointerId);\n\n this.cachedAverages = {\n x: this.getLastAvgX(),\n y: this.getLastAvgY(),\n };\n }\n\n public removeFromTracker(pointerId: number): void {\n this.trackedPointers.delete(pointerId);\n this.removeMappedTouchId(pointerId);\n }\n\n public track(event: AdaptedEvent): void {\n const element: TrackerElement = this.trackedPointers.get(\n event.pointerId\n ) as TrackerElement;\n\n if (!element) {\n return;\n }\n\n this.lastMovedPointerId = event.pointerId;\n\n const dx = event.x - element.lastX;\n const dy = event.y - element.lastY;\n const dt = event.time - element.timeStamp;\n\n element.velocityX = (dx / dt) * 1000 * VELOCITY_FACTOR;\n element.velocityY = (dy / dt) * 1000 * VELOCITY_FACTOR;\n\n element.lastX = event.x;\n element.lastY = event.y;\n\n this.trackedPointers.set(event.pointerId, element);\n\n const avgX: number = this.getLastAvgX();\n const avgY: number = this.getLastAvgY();\n\n this.cachedAverages = {\n x: avgX,\n y: avgY,\n };\n }\n\n //Mapping TouchEvents ID\n private mapTouchEventId(id: number): void {\n for (const [mappedId, touchId] of this.touchEventsIds) {\n if (isNaN(touchId)) {\n this.touchEventsIds.set(mappedId, id);\n break;\n }\n }\n }\n\n private removeMappedTouchId(id: number): void {\n const mappedId: number = this.getMappedTouchEventId(id);\n if (!isNaN(mappedId)) {\n this.touchEventsIds.set(mappedId, NaN);\n }\n }\n\n public getMappedTouchEventId(touchEventId: number): number {\n for (const [key, value] of this.touchEventsIds.entries()) {\n if (value === touchEventId) {\n return key;\n }\n }\n\n return NaN;\n }\n\n public getVelocityX(pointerId: number): number {\n return this.trackedPointers.get(pointerId)?.velocityX as number;\n }\n public getVelocityY(pointerId: number): number {\n return this.trackedPointers.get(pointerId)?.velocityY as number;\n }\n\n /**\n * Returns X coordinate of last moved pointer\n */\n public getLastX(): number;\n\n /**\n *\n * @param pointerId\n * Returns X coordinate of given pointer\n */\n // eslint-disable-next-line @typescript-eslint/unified-signatures\n public getLastX(pointerId: number): number;\n\n public getLastX(pointerId?: number): number {\n if (pointerId !== undefined) {\n return this.trackedPointers.get(pointerId)?.lastX as number;\n } else {\n return this.trackedPointers.get(this.lastMovedPointerId)?.lastX as number;\n }\n }\n\n /**\n * Returns Y coordinate of last moved pointer\n */\n public getLastY(): number;\n\n /**\n *\n * @param pointerId\n * Returns Y coordinate of given pointer\n */\n // eslint-disable-next-line @typescript-eslint/unified-signatures\n public getLastY(pointerId: number): number;\n\n public getLastY(pointerId?: number): number {\n if (pointerId !== undefined) {\n return this.trackedPointers.get(pointerId)?.lastY as number;\n } else {\n return this.trackedPointers.get(this.lastMovedPointerId)?.lastY as number;\n }\n }\n\n // Some handlers use these methods to send average values in native event.\n // This may happen when pointers have already been removed from tracker (i.e. pointerup event).\n // In situation when NaN would be sent as a response, we return cached value.\n // That prevents handlers from crashing\n public getLastAvgX(): number {\n const avgX: number = this.getSumX() / this.trackedPointers.size;\n return isNaN(avgX) ? this.cachedAverages.x : avgX;\n }\n public getLastAvgY(): number {\n const avgY: number = this.getSumY() / this.trackedPointers.size;\n return isNaN(avgY) ? this.cachedAverages.y : avgY;\n }\n public getSumX(ignoredPointer?: number): number {\n let sumX = 0;\n\n this.trackedPointers.forEach((value, key) => {\n if (key !== ignoredPointer) {\n sumX += value.lastX;\n }\n });\n\n return sumX;\n }\n public getSumY(ignoredPointer?: number): number {\n let sumY = 0;\n\n this.trackedPointers.forEach((value, key) => {\n if (key !== ignoredPointer) {\n sumY += value.lastY;\n }\n });\n\n return sumY;\n }\n public getTrackedPointersCount(): number {\n return this.trackedPointers.size;\n }\n public getTrackedPointersID(): number[] {\n const keys: number[] = [];\n\n this.trackedPointers.forEach((_value, key) => {\n keys.push(key);\n });\n\n return keys;\n }\n\n public getData(): Map<number, TrackerElement> {\n return this.trackedPointers;\n }\n\n public resetTracker(): void {\n this.trackedPointers.clear();\n this.lastMovedPointerId = NaN;\n\n for (let i = 0; i < MAX_POINTERS; ++i) {\n this.touchEventsIds.set(i, NaN);\n }\n }\n\n public static shareCommonPointers(\n stPointers: number[],\n ndPointers: number[]\n ): boolean {\n return stPointers.some((pointerId) => ndPointers.includes(pointerId));\n }\n}\n"]}
@@ -35,7 +35,7 @@ export declare const HammerGestures: {
35
35
  FlingGestureHandler: typeof HammerFlingGestureHandler;
36
36
  };
37
37
  declare const _default: {
38
- handleSetJSResponder(tag: number, blockNativeResponder: boolean): void;
38
+ handleSetJSResponder(_tag: number, _blockNativeResponder: boolean): void;
39
39
  handleClearJSResponder(): void;
40
40
  createGestureHandler<T>(handlerName: keyof typeof Gestures, handlerTag: number, config: T): void;
41
41
  attachGestureHandler(handlerTag: number, newView: number, _actionType: ActionType, propsRef: React.RefObject<unknown>): void;
@@ -63,11 +63,11 @@ export interface SwipeableProps extends Pick<PanGestureHandlerProps, SwipeableEx
63
63
  /**
64
64
  * Called when action panel gets open (either right or left).
65
65
  */
66
- onSwipeableOpen?: (direction: 'left' | 'right') => void;
66
+ onSwipeableOpen?: (direction: 'left' | 'right', swipeable: Swipeable) => void;
67
67
  /**
68
68
  * Called when action panel is closed.
69
69
  */
70
- onSwipeableClose?: (direction: 'left' | 'right') => void;
70
+ onSwipeableClose?: (direction: 'left' | 'right', swipeable: Swipeable) => void;
71
71
  /**
72
72
  * @deprecated Use `direction` argument of onSwipeableWillOpen()
73
73
  *
@@ -107,7 +107,7 @@ export interface SwipeableProps extends Pick<PanGestureHandlerProps, SwipeableEx
107
107
  *
108
108
  * To support `rtl` flexbox layouts use `flexDirection` styling.
109
109
  * */
110
- renderRightActions?: (progressAnimatedValue: Animated.AnimatedInterpolation, dragAnimatedValue: Animated.AnimatedInterpolation) => React.ReactNode;
110
+ renderRightActions?: (progressAnimatedValue: Animated.AnimatedInterpolation, dragAnimatedValue: Animated.AnimatedInterpolation, swipeable: Swipeable) => React.ReactNode;
111
111
  useNativeAnimations?: boolean;
112
112
  animationOptions?: Record<string, unknown>;
113
113
  /**
@@ -1,3 +1,7 @@
1
+ export declare const REACT_NATIVE_VERSION: {
2
+ major: number;
3
+ minor: number;
4
+ };
1
5
  export declare function toArray<T>(object: T | T[]): T[];
2
6
  export declare type withPrevAndCurrentMapFn<T, Transformed> = (previous: Transformed | null, current: T) => Transformed;
3
7
  export declare function withPrevAndCurrent<T, Transformed>(array: T[], mapFn: withPrevAndCurrentMapFn<T, Transformed>): Transformed[];
@@ -67,6 +67,7 @@ export default abstract class GestureHandler {
67
67
  sendEvent: (newState: State, oldState: State) => void;
68
68
  private transformEventData;
69
69
  private transformTouchEvent;
70
+ private cancelTouches;
70
71
  protected transformNativeEvent(): {};
71
72
  updateGestureConfig({ enabled, ...props }: Config): void;
72
73
  protected checkCustomActivationCriteria(criterias: string[]): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-gesture-handler",
3
- "version": "2.6.1",
3
+ "version": "2.7.0",
4
4
  "description": "Experimental implementation of a new declarative API for gesture handling in react-native",
5
5
  "scripts": {
6
6
  "prepare": "bob build",
@@ -142,12 +142,8 @@
142
142
  "src/fabric/*NativeComponent.js"
143
143
  ],
144
144
  "codegenConfig": {
145
- "libraries": [
146
- {
147
- "name": "rngesturehandler",
148
- "type": "components",
149
- "jsSrcsDir": "./src/fabric"
150
- }
151
- ]
145
+ "name": "rngesturehandler_codegen",
146
+ "type": "components",
147
+ "jsSrcsDir": "./src/fabric"
152
148
  }
153
149
  }
@@ -46,11 +46,11 @@ export const HammerGestures = {
46
46
  };
47
47
 
48
48
  export default {
49
- handleSetJSResponder(tag: number, blockNativeResponder: boolean) {
50
- console.warn('handleSetJSResponder: ', tag, blockNativeResponder);
49
+ handleSetJSResponder(_tag: number, _blockNativeResponder: boolean) {
50
+ // NO-OP
51
51
  },
52
52
  handleClearJSResponder() {
53
- console.warn('handleClearJSResponder: ');
53
+ // NO-OP
54
54
  },
55
55
  createGestureHandler<T>(
56
56
  handlerName: keyof typeof Gestures,
@@ -57,14 +57,12 @@ export const ScrollView = React.forwardRef<
57
57
  waitFor={[...toArray(waitFor ?? []), refreshControlGestureRef]}
58
58
  // @ts-ignore we don't pass `refreshing` prop as we only want to override the ref
59
59
  refreshControl={
60
- refreshControl ? (
61
- <RefreshControl
62
- {...refreshControl.props}
63
- ref={refreshControlGestureRef}
64
- />
65
- ) : (
66
- refreshControl
67
- )
60
+ refreshControl
61
+ ? React.cloneElement(refreshControl, {
62
+ // @ts-ignore for reasons unknown to me, `ref` doesn't exist on the type inferred by TS
63
+ ref: refreshControlGestureRef,
64
+ })
65
+ : undefined
68
66
  }
69
67
  />
70
68
  );
@@ -129,14 +127,12 @@ export const FlatList = React.forwardRef((props, ref) => {
129
127
  )}
130
128
  // @ts-ignore we don't pass `refreshing` prop as we only want to override the ref
131
129
  refreshControl={
132
- refreshControl ? (
133
- <RefreshControl
134
- {...refreshControl.props}
135
- ref={refreshControlGestureRef}
136
- />
137
- ) : (
138
- refreshControl
139
- )
130
+ refreshControl
131
+ ? React.cloneElement(refreshControl, {
132
+ // @ts-ignore for reasons unknown to me, `ref` doesn't exist on the type inferred by TS
133
+ ref: refreshControlGestureRef,
134
+ })
135
+ : undefined
140
136
  }
141
137
  />
142
138
  );
@@ -106,12 +106,15 @@ export interface SwipeableProps
106
106
  /**
107
107
  * Called when action panel gets open (either right or left).
108
108
  */
109
- onSwipeableOpen?: (direction: 'left' | 'right') => void;
109
+ onSwipeableOpen?: (direction: 'left' | 'right', swipeable: Swipeable) => void;
110
110
 
111
111
  /**
112
112
  * Called when action panel is closed.
113
113
  */
114
- onSwipeableClose?: (direction: 'left' | 'right') => void;
114
+ onSwipeableClose?: (
115
+ direction: 'left' | 'right',
116
+ swipeable: Swipeable
117
+ ) => void;
115
118
 
116
119
  /**
117
120
  * @deprecated Use `direction` argument of onSwipeableWillOpen()
@@ -161,7 +164,8 @@ export interface SwipeableProps
161
164
  * */
162
165
  renderRightActions?: (
163
166
  progressAnimatedValue: Animated.AnimatedInterpolation,
164
- dragAnimatedValue: Animated.AnimatedInterpolation
167
+ dragAnimatedValue: Animated.AnimatedInterpolation,
168
+ swipeable: Swipeable
165
169
  ) => React.ReactNode;
166
170
 
167
171
  useNativeAnimations?: boolean;
@@ -381,13 +385,13 @@ export default class Swipeable extends Component<
381
385
  if (finished) {
382
386
  if (toValue > 0) {
383
387
  this.props.onSwipeableLeftOpen?.();
384
- this.props.onSwipeableOpen?.('left');
388
+ this.props.onSwipeableOpen?.('left', this);
385
389
  } else if (toValue < 0) {
386
390
  this.props.onSwipeableRightOpen?.();
387
- this.props.onSwipeableOpen?.('right');
391
+ this.props.onSwipeableOpen?.('right', this);
388
392
  } else {
389
393
  const closingDirection = fromValue > 0 ? 'left' : 'right';
390
- this.props.onSwipeableClose?.(closingDirection);
394
+ this.props.onSwipeableClose?.(closingDirection, this);
391
395
  }
392
396
  }
393
397
  });
@@ -463,7 +467,7 @@ export default class Swipeable extends Component<
463
467
  styles.rightActions,
464
468
  { transform: [{ translateX: this.rightActionTranslate! }] },
465
469
  ]}>
466
- {renderRightActions(this.showRightAction!, this.transX!)}
470
+ {renderRightActions(this.showRightAction!, this.transX!, this)}
467
471
  <View
468
472
  onLayout={({ nativeEvent }) =>
469
473
  this.setState({ rightOffset: nativeEvent.layout.x })
@@ -35,7 +35,7 @@ import { State } from '../../State';
35
35
  import { TouchEventType } from '../../TouchEventType';
36
36
  import { ComposedGesture } from './gestureComposition';
37
37
  import { ActionType } from '../../ActionType';
38
- import { isFabric, tagMessage } from '../../utils';
38
+ import { isFabric, REACT_NATIVE_VERSION, tagMessage } from '../../utils';
39
39
  import { getShadowNodeFromRef } from '../../getShadowNodeFromRef';
40
40
  import { Platform } from 'react-native';
41
41
  import type RNGestureHandlerModuleWeb from '../../RNGestureHandlerModule.web';
@@ -539,8 +539,13 @@ function validateDetectorChildren(ref: any) {
539
539
  // / \
540
540
  // NativeView NativeView
541
541
  if (__DEV__ && Platform.OS !== 'web') {
542
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
543
- const wrapType = ref._reactInternals.elementType;
542
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
543
+ const wrapType =
544
+ REACT_NATIVE_VERSION.minor > 63 || REACT_NATIVE_VERSION.major > 0
545
+ ? // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
546
+ ref._reactInternals.elementType
547
+ : // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
548
+ ref._reactInternalFiber.elementType;
544
549
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
545
550
  let instance = RNRenderer.findHostInstance_DEPRECATED(ref)
546
551
  ._internalFiberInstanceHandleDEV;
package/src/utils.ts CHANGED
@@ -1,6 +1,10 @@
1
1
  import pack from 'react-native/package.json';
2
2
 
3
- const rnVersion = pack.version;
3
+ const [majorStr, minorStr] = pack.version.split('.');
4
+ export const REACT_NATIVE_VERSION = {
5
+ major: parseInt(majorStr, 10),
6
+ minor: parseInt(minorStr, 10),
7
+ };
4
8
 
5
9
  export function toArray<T>(object: T | T[]): T[] {
6
10
  if (!Array.isArray(object)) {
@@ -52,12 +56,8 @@ export function isFabric(): boolean {
52
56
  }
53
57
 
54
58
  export function shouldUseCodegenNativeComponent(): boolean {
55
- const [majorStr, minorStr] = rnVersion.split('.');
56
- const major = Number.parseInt(majorStr);
57
- const minor = Number.parseInt(minorStr);
58
-
59
59
  // use codegenNativeComponent starting with RN 0.68
60
- return minor >= 68 || major > 0;
60
+ return REACT_NATIVE_VERSION.minor >= 68 || REACT_NATIVE_VERSION.major > 0;
61
61
  }
62
62
 
63
63
  export function isRemoteDebuggingEnabled(): boolean {
@@ -121,6 +121,16 @@ export default abstract class GestureHandler {
121
121
  return;
122
122
  }
123
123
 
124
+ if (
125
+ this.tracker.getTrackedPointersCount() > 0 &&
126
+ this.config.needsPointerData &&
127
+ (newState === State.END ||
128
+ newState === State.CANCELLED ||
129
+ newState === State.FAILED)
130
+ ) {
131
+ this.cancelTouches();
132
+ }
133
+
124
134
  const oldState = this.currentState;
125
135
  this.currentState = newState;
126
136
 
@@ -507,6 +517,56 @@ export default abstract class GestureHandler {
507
517
  };
508
518
  }
509
519
 
520
+ private cancelTouches(): void {
521
+ const rect = this.view.getBoundingClientRect();
522
+
523
+ const all: PointerData[] = [];
524
+ const changed: PointerData[] = [];
525
+
526
+ const trackerData = this.tracker.getData();
527
+
528
+ if (trackerData.size === 0) {
529
+ return;
530
+ }
531
+
532
+ trackerData.forEach((element: TrackerElement, key: number): void => {
533
+ const id: number = this.tracker.getMappedTouchEventId(key);
534
+
535
+ all.push({
536
+ id: id,
537
+ x: element.lastX - rect.left,
538
+ y: element.lastY - rect.top,
539
+ absoluteX: element.lastX,
540
+ absoluteY: element.lastY,
541
+ });
542
+
543
+ changed.push({
544
+ id: id,
545
+ x: element.lastX - rect.left,
546
+ y: element.lastY - rect.top,
547
+ absoluteX: element.lastX,
548
+ absoluteY: element.lastY,
549
+ });
550
+ });
551
+
552
+ const cancelEvent: ResultTouchEvent = {
553
+ nativeEvent: {
554
+ handlerTag: this.handlerTag,
555
+ state: this.currentState,
556
+ eventType: TouchEventType.CANCELLED,
557
+ changedTouches: changed,
558
+ allTouches: all,
559
+ numberOfTouches: all.length,
560
+ },
561
+ timeStamp: Date.now(),
562
+ };
563
+
564
+ const { onGestureHandlerEvent }: PropsRef = this.propsRef
565
+ .current as PropsRef;
566
+
567
+ invokeNullableMethod(onGestureHandlerEvent, cancelEvent);
568
+ }
569
+
510
570
  protected transformNativeEvent() {
511
571
  return {};
512
572
  }
@@ -143,7 +143,7 @@ export default class PointerTracker {
143
143
  public getLastX(pointerId: number): number;
144
144
 
145
145
  public getLastX(pointerId?: number): number {
146
- if (pointerId) {
146
+ if (pointerId !== undefined) {
147
147
  return this.trackedPointers.get(pointerId)?.lastX as number;
148
148
  } else {
149
149
  return this.trackedPointers.get(this.lastMovedPointerId)?.lastX as number;
@@ -164,7 +164,7 @@ export default class PointerTracker {
164
164
  public getLastY(pointerId: number): number;
165
165
 
166
166
  public getLastY(pointerId?: number): number {
167
- if (pointerId) {
167
+ if (pointerId !== undefined) {
168
168
  return this.trackedPointers.get(pointerId)?.lastY as number;
169
169
  } else {
170
170
  return this.trackedPointers.get(this.lastMovedPointerId)?.lastY as number;