@react-native-oh-tpl/react-native-gesture-handler 2.14.7 → 2.14.13

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 (117) hide show
  1. package/DrawerLayout/index.ts +2 -2
  2. package/Swipeable/index.ts +2 -2
  3. package/harmony/gesture_handler/BuildProfile.ets +17 -0
  4. package/harmony/gesture_handler/build-profile.json5 +19 -0
  5. package/harmony/gesture_handler/hvigorfile.ts +2 -0
  6. package/harmony/gesture_handler/index.ets +3 -0
  7. package/harmony/gesture_handler/oh-package-lock.json5 +18 -0
  8. package/harmony/gesture_handler/oh-package.json5 +12 -0
  9. package/harmony/gesture_handler/src/main/cpp/CMakeLists.txt +8 -0
  10. package/harmony/gesture_handler/src/main/cpp/GestureHandlerPackage.cpp +149 -0
  11. package/harmony/gesture_handler/src/main/cpp/GestureHandlerPackage.h +21 -0
  12. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerButtonComponentDescriptor.h +36 -0
  13. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerButtonJSIBinder.h +32 -0
  14. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerModule.cpp +22 -0
  15. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerModule.h +15 -0
  16. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerRootViewComponentDescriptor.h +36 -0
  17. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerRootViewJSIBinder.h +25 -0
  18. package/harmony/gesture_handler/src/main/cpp/componentInstances/RNGestureHandlerButtonComponentInstance.h +27 -0
  19. package/harmony/gesture_handler/src/main/cpp/componentInstances/RNGestureHandlerRootViewComponentInstance.h +242 -0
  20. package/harmony/gesture_handler/src/main/ets/core/CircularBuffer.ts +42 -0
  21. package/harmony/gesture_handler/src/main/ets/core/GestureHandler.ts +690 -0
  22. package/harmony/gesture_handler/src/main/ets/core/GestureHandlerOrchestrator.ts +335 -0
  23. package/harmony/gesture_handler/src/main/ets/core/GestureHandlerRegistry.ts +63 -0
  24. package/harmony/gesture_handler/src/main/ets/core/IncomingEvent.ts +78 -0
  25. package/harmony/gesture_handler/src/main/ets/core/InteractionManager.ts +144 -0
  26. package/harmony/gesture_handler/src/main/ets/core/LeastSquareSolver.ts +182 -0
  27. package/harmony/gesture_handler/src/main/ets/core/OutgoingEvent.ts +34 -0
  28. package/harmony/gesture_handler/src/main/ets/core/OutgoingEventDispatcher.ts +12 -0
  29. package/harmony/gesture_handler/src/main/ets/core/PointerTracker.ts +239 -0
  30. package/harmony/gesture_handler/src/main/ets/core/RNGHError.ts +5 -0
  31. package/harmony/gesture_handler/src/main/ets/core/RNGHLogger.ts +12 -0
  32. package/harmony/gesture_handler/src/main/ets/core/State.ts +47 -0
  33. package/harmony/gesture_handler/src/main/ets/core/Vector2D.ts +80 -0
  34. package/harmony/gesture_handler/src/main/ets/core/VelocityTracker.ts +106 -0
  35. package/harmony/gesture_handler/src/main/ets/core/View.ts +21 -0
  36. package/harmony/gesture_handler/src/main/ets/core/ViewFinder.ts +11 -0
  37. package/harmony/gesture_handler/src/main/ets/core/ViewRegistry.ts +8 -0
  38. package/harmony/gesture_handler/src/main/ets/core/index.ts +15 -0
  39. package/harmony/gesture_handler/src/main/ets/detectors/ScaleGestureDetector.ts +169 -0
  40. package/harmony/gesture_handler/src/main/ets/gesture-handlers/FlingGestureHandler.ts +211 -0
  41. package/harmony/gesture_handler/src/main/ets/gesture-handlers/GestureHandlerFactory.ts +64 -0
  42. package/harmony/gesture_handler/src/main/ets/gesture-handlers/LongPressGestureHandler.ts +127 -0
  43. package/harmony/gesture_handler/src/main/ets/gesture-handlers/ManualGestureHandler.ts +42 -0
  44. package/harmony/gesture_handler/src/main/ets/gesture-handlers/NativeViewGestureHandler.ts +115 -0
  45. package/harmony/gesture_handler/src/main/ets/gesture-handlers/PanGestureHandler.ts +342 -0
  46. package/harmony/gesture_handler/src/main/ets/gesture-handlers/PinchGestureHandler.ts +159 -0
  47. package/harmony/gesture_handler/src/main/ets/gesture-handlers/RotationGestureHandler.ts +164 -0
  48. package/harmony/gesture_handler/src/main/ets/gesture-handlers/TapGestureHandler.ts +206 -0
  49. package/harmony/gesture_handler/src/main/ets/gesture-handlers/detectors/RotationGestureDetector.ts +167 -0
  50. package/harmony/gesture_handler/src/main/ets/gesture-handlers/index.ts +1 -0
  51. package/harmony/gesture_handler/src/main/ets/namespace/RNGestureHandlerModule.ts +24 -0
  52. package/harmony/gesture_handler/src/main/ets/namespace/components/RNGestureHandlerButton.ts +139 -0
  53. package/harmony/gesture_handler/src/main/ets/namespace/components/RNGestureHandlerRootView.ts +101 -0
  54. package/harmony/gesture_handler/src/main/ets/namespace/components/ts.ts +2 -0
  55. package/harmony/gesture_handler/src/main/ets/namespace/ts.ts +2 -0
  56. package/harmony/gesture_handler/src/main/ets/rnoh/GestureHandlerArkUIAdapter.ts +240 -0
  57. package/harmony/gesture_handler/src/main/ets/rnoh/GestureHandlerPackage.ts +22 -0
  58. package/harmony/gesture_handler/src/main/ets/rnoh/Logger.ts +49 -0
  59. package/harmony/gesture_handler/src/main/ets/rnoh/OutgoingEventDispatchers.ts +71 -0
  60. package/harmony/gesture_handler/src/main/ets/rnoh/RNGHRootTouchHandlerArkTS.ts +98 -0
  61. package/harmony/gesture_handler/src/main/ets/rnoh/RNGHRootTouchHandlerCAPI.ts +110 -0
  62. package/harmony/gesture_handler/src/main/ets/rnoh/RNGestureHandlerButton.ets +38 -0
  63. package/harmony/gesture_handler/src/main/ets/rnoh/RNGestureHandlerModule.ts +233 -0
  64. package/harmony/gesture_handler/src/main/ets/rnoh/RNGestureHandlerRootView.ets +53 -0
  65. package/harmony/gesture_handler/src/main/ets/rnoh/RNOHGestureResponder.ts +24 -0
  66. package/harmony/gesture_handler/src/main/ets/rnoh/RNOHScrollLocker.ts +32 -0
  67. package/harmony/gesture_handler/src/main/ets/rnoh/View.ts +134 -0
  68. package/harmony/gesture_handler/src/main/ets/rnoh/ViewRegistry.ts +97 -0
  69. package/harmony/gesture_handler/src/main/ets/rnoh/types.ts +25 -0
  70. package/harmony/gesture_handler/src/main/module.json5 +9 -0
  71. package/harmony/gesture_handler/src/main/resources/base/element/color.json +8 -0
  72. package/harmony/gesture_handler/src/main/resources/base/element/string.json +16 -0
  73. package/harmony/gesture_handler/src/main/resources/base/media/icon.png +0 -0
  74. package/harmony/gesture_handler/src/main/resources/base/profile/main_pages.json +5 -0
  75. package/harmony/gesture_handler/src/main/resources/en_US/element/string.json +16 -0
  76. package/harmony/gesture_handler/src/main/resources/zh_CN/element/string.json +16 -0
  77. package/harmony/gesture_handler/ts.ts +2 -0
  78. package/harmony/gesture_handler.har +0 -0
  79. package/lib/commonjs/RNGestureHandlerModule.js +3 -2
  80. package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
  81. package/lib/commonjs/components/GestureHandlerRootView.js +3 -3
  82. package/lib/commonjs/components/GestureHandlerRootView.js.map +1 -1
  83. package/lib/commonjs/handlers/createHandler.js +18 -15
  84. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  85. package/lib/commonjs/index.js +36 -8
  86. package/lib/commonjs/index.js.map +1 -1
  87. package/lib/commonjs/specs/NativeRNGestureHandlerModule.js +2 -1
  88. package/lib/commonjs/specs/NativeRNGestureHandlerModule.js.map +1 -1
  89. package/lib/commonjs/specs/RNGestureHandlerButtonNativeComponent.js +3 -2
  90. package/lib/commonjs/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  91. package/lib/commonjs/specs/RNGestureHandlerRootViewNativeComponent.js +3 -2
  92. package/lib/commonjs/specs/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
  93. package/lib/module/RNGestureHandlerModule.js.map +1 -1
  94. package/lib/module/components/GestureHandlerRootView.js.map +1 -1
  95. package/lib/module/handlers/createHandler.js +15 -12
  96. package/lib/module/handlers/createHandler.js.map +1 -1
  97. package/lib/module/index.js +5 -7
  98. package/lib/module/index.js.map +1 -1
  99. package/lib/module/specs/NativeRNGestureHandlerModule.js.map +1 -1
  100. package/lib/module/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  101. package/lib/module/specs/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
  102. package/lib/typescript/RNGestureHandlerModule.d.ts +2 -2
  103. package/lib/typescript/components/GestureHandlerRootView.d.ts +6 -6
  104. package/lib/typescript/handlers/createHandler.d.ts +11 -11
  105. package/lib/typescript/index.d.ts +47 -42
  106. package/lib/typescript/index.d.ts.map +1 -1
  107. package/lib/typescript/specs/NativeRNGestureHandlerModule.d.ts +14 -14
  108. package/lib/typescript/specs/RNGestureHandlerButtonNativeComponent.d.ts +14 -14
  109. package/lib/typescript/specs/RNGestureHandlerRootViewNativeComponent.d.ts +6 -6
  110. package/package.json +73 -72
  111. package/src/RNGestureHandlerModule.ts +4 -4
  112. package/src/components/GestureHandlerRootView.tsx +23 -23
  113. package/src/handlers/createHandler.tsx +534 -534
  114. package/src/index.ts +172 -172
  115. package/src/specs/NativeRNGestureHandlerModule.ts +26 -26
  116. package/src/specs/RNGestureHandlerButtonNativeComponent.ts +18 -18
  117. package/src/specs/RNGestureHandlerRootViewNativeComponent.ts +6 -6
@@ -0,0 +1,127 @@
1
+ import { GestureHandler, IncomingEvent, GestureConfig, State, GestureHandlerDependencies } from '../core';
2
+
3
+ const DEFAULT_MIN_DURATION_MS = 500;
4
+ const DEFAULT_MAX_DIST_DP = 10;
5
+ const SCALING_FACTOR = 10;
6
+
7
+ export class LongPressGestureHandler extends GestureHandler {
8
+ private minDurationMs = DEFAULT_MIN_DURATION_MS;
9
+ private defaultMaxDistSq = DEFAULT_MAX_DIST_DP * SCALING_FACTOR;
10
+
11
+ private maxDistSq = this.defaultMaxDistSq;
12
+ private startX = 0;
13
+ private startY = 0;
14
+
15
+ private startTime = 0;
16
+ private previousTime = 0;
17
+
18
+ private activationTimeout: number | undefined;
19
+
20
+ constructor(deps: GestureHandlerDependencies) {
21
+ super({...deps, logger: deps.logger.cloneWithPrefix("LongPressGestureHandler")})
22
+ }
23
+
24
+ public getDefaultConfig() {
25
+ return {}
26
+ }
27
+
28
+ protected transformNativeEvent() {
29
+ return {
30
+ ...super.transformNativeEvent(),
31
+ duration: Date.now() - this.startTime,
32
+ };
33
+ }
34
+
35
+ public updateGestureConfig({ enabled = true, ...props }: GestureConfig): void {
36
+ super.updateGestureConfig({ enabled: enabled, ...props });
37
+
38
+ if (this.config.minDurationMs !== undefined) {
39
+ this.minDurationMs = this.config.minDurationMs;
40
+ }
41
+
42
+ if (this.config.maxDist !== undefined) {
43
+ this.maxDistSq = this.config.maxDist * this.config.maxDist;
44
+ }
45
+ }
46
+
47
+
48
+
49
+ protected resetConfig(): void {
50
+ super.resetConfig();
51
+ this.minDurationMs = DEFAULT_MIN_DURATION_MS;
52
+ this.maxDistSq = this.defaultMaxDistSq;
53
+ }
54
+
55
+ protected onStateChange(newState: State, oldState: State): void {
56
+ super.onStateChange(newState, oldState)
57
+ clearTimeout(this.activationTimeout);
58
+ }
59
+
60
+ public onPointerDown(event: IncomingEvent): void {
61
+ this.tracker.addToTracker(event);
62
+ super.onPointerDown(event);
63
+ this.tryBegin(event);
64
+ this.tryActivate();
65
+ this.checkDistanceFail(event);
66
+ }
67
+
68
+ public onPointerMove(event: IncomingEvent): void {
69
+ super.onPointerMove(event);
70
+ this.tracker.track(event);
71
+ this.checkDistanceFail(event);
72
+ }
73
+
74
+ public onPointerUp(event: IncomingEvent): void {
75
+ super.onPointerUp(event);
76
+ this.tracker.removeFromTracker(event.pointerId);
77
+
78
+ if (this.currentState === State.ACTIVE) {
79
+ this.end();
80
+ } else {
81
+ this.fail();
82
+ }
83
+ }
84
+
85
+ private tryBegin(event: IncomingEvent): void {
86
+ if (this.currentState !== State.UNDETERMINED) {
87
+ return;
88
+ }
89
+
90
+ this.previousTime = Date.now();
91
+ this.startTime = this.previousTime;
92
+
93
+ this.begin();
94
+
95
+ this.startX = event.x;
96
+ this.startY = event.y;
97
+ }
98
+
99
+ private tryActivate(): void {
100
+ if (this.minDurationMs > 0) {
101
+ if (this.activationTimeout) {
102
+ clearTimeout(this.activationTimeout)
103
+ }
104
+ this.activationTimeout = setTimeout(() => {
105
+ this.activate();
106
+ }, this.minDurationMs);
107
+ } else if (this.minDurationMs === 0) {
108
+ this.activate();
109
+ }
110
+ }
111
+
112
+ private checkDistanceFail(event: IncomingEvent): void {
113
+ const dx = event.x - this.startX;
114
+ const dy = event.y - this.startY;
115
+ const distSq = dx * dx + dy * dy;
116
+
117
+ if (distSq <= this.maxDistSq) {
118
+ return;
119
+ }
120
+
121
+ if (this.currentState === State.ACTIVE) {
122
+ this.cancel();
123
+ } else {
124
+ this.fail();
125
+ }
126
+ }
127
+ }
@@ -0,0 +1,42 @@
1
+ import { GestureHandler, GestureHandlerDependencies, IncomingEvent } from '../core';
2
+
3
+ export class ManualGestureHandler extends GestureHandler {
4
+ constructor(deps: GestureHandlerDependencies) {
5
+ super({...deps, logger: deps.logger.cloneWithPrefix("ManualGestureHandler")})
6
+ }
7
+
8
+ public getDefaultConfig() {
9
+ return {}
10
+ }
11
+
12
+ public onPointerDown(event: IncomingEvent): void {
13
+ this.tracker.addToTracker(event);
14
+ super.onPointerDown(event);
15
+ this.begin();
16
+ }
17
+
18
+ public onAdditionalPointerAdd(event: IncomingEvent): void {
19
+ this.tracker.addToTracker(event);
20
+ super.onAdditionalPointerAdd(event);
21
+ }
22
+
23
+ public onPointerMove(event: IncomingEvent): void {
24
+ this.tracker.track(event);
25
+ super.onPointerMove(event);
26
+ }
27
+
28
+ public onPointerOutOfBounds(event: IncomingEvent): void {
29
+ this.tracker.track(event);
30
+ super.onPointerOutOfBounds(event);
31
+ }
32
+
33
+ public onPointerUp(event: IncomingEvent): void {
34
+ super.onPointerUp(event);
35
+ this.tracker.removeFromTracker(event.pointerId);
36
+ }
37
+
38
+ public onAdditionalPointerRemove(event: IncomingEvent): void {
39
+ super.onAdditionalPointerRemove(event);
40
+ this.tracker.removeFromTracker(event.pointerId);
41
+ }
42
+ }
@@ -0,0 +1,115 @@
1
+ import { GestureHandler, GestureHandlerDependencies, DEFAULT_TOUCH_SLOP, Vector2D, State, IncomingEvent } from "../core"
2
+
3
+
4
+ export class NativeViewGestureHandler extends GestureHandler {
5
+ private minDistSq = DEFAULT_TOUCH_SLOP * DEFAULT_TOUCH_SLOP;
6
+
7
+ protected startPos = new Vector2D()
8
+
9
+ public canBeInterrupted() {
10
+ return !(this.config.disallowInterruption ?? false)
11
+ }
12
+
13
+ constructor(deps: GestureHandlerDependencies) {
14
+ super({ ...deps, logger: deps.logger.cloneWithPrefix("NativeViewGestureHandler") })
15
+ }
16
+
17
+ public getDefaultConfig() {
18
+ return {}
19
+ }
20
+
21
+ public onPointerDown(e: IncomingEvent) {
22
+ this.tracker.addToTracker(e);
23
+ super.onPointerDown(e);
24
+ this.onNewPointer();
25
+ }
26
+
27
+ protected onNewPointer() {
28
+ this.startPos = this.tracker.getLastAvgPos();
29
+ if (this.currentState !== State.UNDETERMINED)
30
+ return;
31
+ this.begin();
32
+ if(this.view.hasButtonRole()) {
33
+ this.activate();
34
+ }
35
+ }
36
+
37
+ public onAdditionalPointerAdd(e: IncomingEvent) {
38
+ this.tracker.addToTracker(e);
39
+ super.onPointerDown(e);
40
+ this.onNewPointer();
41
+ }
42
+
43
+ public onPointerMove(e: IncomingEvent): void {
44
+ this.tracker.track(e);
45
+ const {x: dx, y: dy} = this.startPos.clone().subtract(this.tracker.getLastAvgPos()).value
46
+ const distSq = dx * dx + dy * dy;
47
+
48
+ if (distSq >= this.minDistSq) {
49
+ if (this.view.hasButtonRole() && this.currentState === State.ACTIVE) {
50
+ this.cancel();
51
+ } else if (!this.view.hasButtonRole() && this.currentState === State.BEGAN) {
52
+ this.activate();
53
+ }
54
+ }
55
+ }
56
+
57
+ public onPointerLeave(): void {
58
+ // TODO: add this method to GestureHandler
59
+ if (this.currentState === State.BEGAN || this.currentState === State.ACTIVE) {
60
+ this.cancel();
61
+ }
62
+ }
63
+
64
+ public onPointerUp(event: IncomingEvent): void {
65
+ super.onPointerUp(event);
66
+ this.onAnyPointerUp(event);
67
+ }
68
+
69
+ private onAnyPointerUp(e: IncomingEvent) {
70
+ this.tracker.removeFromTracker(e.pointerId);
71
+ if (this.tracker.getTrackedPointersCount() === 0) {
72
+ if (this.currentState === State.ACTIVE) {
73
+ this.end();
74
+ } else {
75
+ this.fail();
76
+ }
77
+ }
78
+ }
79
+
80
+ public onAdditionalPointerRemove(e: IncomingEvent) {
81
+ super.onAdditionalPointerRemove(e)
82
+ this.onAnyPointerUp(e)
83
+ }
84
+
85
+ public shouldRecognizeSimultaneously(handler: GestureHandler): boolean {
86
+ if (super.shouldRecognizeSimultaneously(handler)) {
87
+ return true;
88
+ }
89
+ if (
90
+ handler instanceof NativeViewGestureHandler &&
91
+ handler.getState() === State.ACTIVE &&
92
+ !handler.canBeInterrupted()
93
+ ) {
94
+ return false;
95
+ }
96
+
97
+ if (
98
+ this.currentState === State.ACTIVE &&
99
+ handler.getState() === State.ACTIVE &&
100
+ this.canBeInterrupted()
101
+ ) {
102
+ return false;
103
+ }
104
+
105
+ return (
106
+ this.currentState === State.ACTIVE &&
107
+ this.canBeInterrupted() &&
108
+ handler.getTag() > 0
109
+ );
110
+ }
111
+
112
+ public shouldBeCancelledByOther(_handler: GestureHandler): boolean {
113
+ return this.canBeInterrupted();
114
+ }
115
+ }
@@ -0,0 +1,342 @@
1
+ import {
2
+ GestureHandler,
3
+ GestureConfig,
4
+ GestureHandlerDependencies,
5
+ DEFAULT_TOUCH_SLOP,
6
+ IncomingEvent,
7
+ State,
8
+ Vector2D,
9
+ getStateName
10
+ } from "../core"
11
+
12
+
13
+ const DEFAULT_MIN_DIST_SQ = DEFAULT_TOUCH_SLOP * DEFAULT_TOUCH_SLOP;
14
+
15
+ type PanGestureHandlerConfig = GestureConfig
16
+
17
+ export class PanGestureHandler extends GestureHandler<PanGestureHandlerConfig> {
18
+ private startPos = new Vector2D();
19
+ private offset = new Vector2D()
20
+ private lastPos = new Vector2D();
21
+ private velocity = new Vector2D();
22
+ private activationTimeout = 0;
23
+
24
+ private get failOffsetXStart() {
25
+ if (this.config.failOffsetXStart === undefined
26
+ && this.config.failOffsetXEnd === undefined)
27
+ return undefined
28
+ return this.config.failOffsetXStart ?? Number.MIN_SAFE_INTEGER
29
+ }
30
+
31
+ private get failOffsetXEnd() {
32
+ if (this.config.failOffsetXStart === undefined
33
+ && this.config.failOffsetXEnd === undefined)
34
+ return undefined
35
+ return this.config.failOffsetXEnd ?? Number.MAX_SAFE_INTEGER
36
+ }
37
+
38
+ private get failOffsetYStart() {
39
+ if (this.config.failOffsetYStart === undefined
40
+ && this.config.failOffsetYEnd === undefined)
41
+ return undefined
42
+ return this.config.failOffsetYStart ?? Number.MIN_SAFE_INTEGER
43
+ }
44
+
45
+ private get failOffsetYEnd() {
46
+ return this.config.failOffsetYEnd ?? Number.MAX_SAFE_INTEGER
47
+ }
48
+
49
+ private get activeOffsetXStart() {
50
+ if (this.config.activeOffsetXStart === undefined
51
+ && this.config.activeOffsetXEnd === undefined)
52
+ return undefined
53
+ return this.config.activeOffsetXStart ?? Number.MIN_SAFE_INTEGER
54
+ }
55
+
56
+ private get activeOffsetXEnd() {
57
+ if (this.config.activeOffsetXStart === undefined
58
+ && this.config.activeOffsetXEnd === undefined)
59
+ return undefined
60
+ return this.config.activeOffsetXEnd ?? Number.MAX_SAFE_INTEGER
61
+ }
62
+
63
+ private get activeOffsetYStart() {
64
+ if (this.config.activeOffsetYStart === undefined
65
+ && this.config.activeOffsetYEnd === undefined)
66
+ return undefined
67
+ return this.config.activeOffsetYStart ?? Number.MIN_SAFE_INTEGER
68
+ }
69
+
70
+ private get activeOffsetYEnd() {
71
+ if (this.config.activeOffsetYStart === undefined
72
+ && this.config.activeOffsetYEnd === undefined)
73
+ return undefined
74
+ return this.config.activeOffsetYEnd ?? Number.MAX_SAFE_INTEGER
75
+ }
76
+
77
+ private get minVelocityX() {
78
+ return this.config.minVelocityX ?? this.config.minVelocity ?? Number.MAX_SAFE_INTEGER
79
+ }
80
+
81
+ private get minVelocityY() {
82
+ return this.config.minVelocityY ?? this.config.minVelocityY ?? Number.MAX_SAFE_INTEGER
83
+ }
84
+
85
+ private minVelocitySq = Number.MAX_SAFE_INTEGER
86
+
87
+ private get minPointers() {
88
+ return this.config.minPointers ?? 1
89
+ }
90
+
91
+ private unlockScrolls: (() => void) | undefined
92
+ private unlockRNGestureResponder: (() => void) | undefined
93
+
94
+ public constructor(deps: GestureHandlerDependencies) {
95
+ super({ ...deps, logger: deps.logger.cloneWithPrefix("PanGestureHandler") })
96
+ }
97
+
98
+ public onPointerDown(e) {
99
+ this.tracker.addToTracker(e);
100
+ super.onPointerDown(e);
101
+ this.lastPos = this.tracker.getLastAvgPos()
102
+ this.startPos = this.lastPos.clone()
103
+ this.tryBegin(e);
104
+ this.tryActivating();
105
+ }
106
+
107
+ private tryActivating(): void {
108
+ if (this.currentState === State.BEGAN) {
109
+ if (this.shouldFail()) {
110
+ this.fail();
111
+ } else if (this.shouldActivate()) {
112
+ this.activate();
113
+ }
114
+ }
115
+ }
116
+
117
+ private shouldFail(): boolean {
118
+ const {x: dx, y: dy} = this.getTranslation().value;
119
+ const distanceSq = dx * dx + dy * dy;
120
+ if (this.activateAfterLongPress > 0 && distanceSq > DEFAULT_MIN_DIST_SQ) {
121
+ this.clearActivationTimeout();
122
+ return true;
123
+ }
124
+ if (this.failOffsetXStart !== Number.MIN_SAFE_INTEGER && dx < this.failOffsetXStart) {
125
+ return true;
126
+ }
127
+ if (this.failOffsetXEnd !== Number.MAX_SAFE_INTEGER && dx > this.failOffsetXEnd) {
128
+ return true;
129
+ }
130
+ if (this.failOffsetYStart !== Number.MIN_SAFE_INTEGER && dy < this.failOffsetYStart) {
131
+ return true;
132
+ }
133
+ return (this.failOffsetYEnd !== Number.MAX_SAFE_INTEGER && dy > this.failOffsetYEnd);
134
+ }
135
+
136
+ private getTranslation() {
137
+ return this.lastPos.clone().subtract(this.startPos).add(this.offset)
138
+ }
139
+
140
+ private shouldActivate(): boolean {
141
+ const {x: dx, y: dy} = this.getTranslation().value;
142
+ if (this.activeOffsetXStart !== Number.MAX_SAFE_INTEGER && dx < this.activeOffsetXStart
143
+ ) {
144
+ return true;
145
+ }
146
+ if (this.activeOffsetXEnd !== Number.MIN_SAFE_INTEGER && dx > this.activeOffsetXEnd) {
147
+ return true;
148
+ }
149
+ if (this.activeOffsetYStart !== Number.MAX_SAFE_INTEGER && dy < this.activeOffsetYStart) {
150
+ return true;
151
+ }
152
+ if (this.activeOffsetYEnd !== Number.MIN_SAFE_INTEGER && dy > this.activeOffsetYEnd) {
153
+ return true;
154
+ }
155
+ const distanceSq: number = dx * dx + dy * dy;
156
+ if (this.minDistSq !== Number.MAX_SAFE_INTEGER && distanceSq >= this.minDistSq) {
157
+ return true;
158
+ }
159
+ const {x: vx, y: vy} = this.velocity
160
+ if (
161
+ this.minVelocityX !== Number.MAX_SAFE_INTEGER &&
162
+ ((this.minVelocityX < 0 && vx <= this.minVelocityX) ||
163
+ (this.minVelocityX >= 0 && this.minVelocityX <= vx))
164
+ ) {
165
+ return true;
166
+ }
167
+ if (
168
+ this.minVelocityY !== Number.MAX_SAFE_INTEGER &&
169
+ ((this.minVelocityY < 0 && vy <= this.minVelocityY) ||
170
+ (this.minVelocityY >= 0 && this.minVelocityY <= vy))
171
+ ) {
172
+ return true;
173
+ }
174
+ const velocitySq: number = vx * vx + vy * vy;
175
+ return (
176
+ this.minVelocitySq !== Number.MAX_SAFE_INTEGER &&
177
+ velocitySq >= this.minVelocitySq
178
+ );
179
+ }
180
+
181
+ private clearActivationTimeout(): void {
182
+ clearTimeout(this.activationTimeout);
183
+ }
184
+
185
+ private tryBegin(e: IncomingEvent): void {
186
+ this.logger.cloneWithPrefix("tryBegin").debug({currentState: getStateName(this.currentState), trackedPointersCount: this.tracker.getTrackedPointersCount(), minPointers: this.minPointers})
187
+ if (
188
+ (this.currentState === State.UNDETERMINED) &&
189
+ this.tracker.getTrackedPointersCount() >= this.minPointers
190
+ ) {
191
+ this.resetProgress();
192
+ this.offset = new Vector2D();
193
+ this.velocity = new Vector2D();
194
+
195
+ this.begin();
196
+
197
+ if (this.activateAfterLongPress > 0) {
198
+ this.activationTimeout = setTimeout(() => {
199
+ this.activate();
200
+ }, this.activateAfterLongPress);
201
+ }
202
+ } else {
203
+ this.velocity = this.tracker.getVelocity(e.pointerId)
204
+ }
205
+ }
206
+
207
+ public getDefaultConfig() {
208
+ return {}
209
+ }
210
+
211
+ private get activateAfterLongPress() {
212
+ return this.config.activateAfterLongPress ?? 0
213
+ }
214
+
215
+ private get minDistSq() {
216
+ if (this.config.minDist !== undefined) {
217
+ return this.config.minDist * this.config.minDist;
218
+ } else if (this.hasCustomActivationCriteria()) {
219
+ return Number.MAX_SAFE_INTEGER;
220
+ }
221
+ return DEFAULT_MIN_DIST_SQ
222
+ }
223
+
224
+ private hasCustomActivationCriteria() {
225
+ const criterias: (keyof PanGestureHandlerConfig)[] = [
226
+ 'activeOffsetXStart',
227
+ 'activeOffsetXEnd',
228
+ 'failOffsetXStart',
229
+ 'failOffsetXEnd',
230
+ 'activeOffsetYStart',
231
+ 'activeOffsetYEnd',
232
+ 'failOffsetYStart',
233
+ 'failOffsetYEnd',
234
+ 'minVelocityX',
235
+ 'minVelocityY',
236
+ ]
237
+ for (const key in this.config) {
238
+ if (criterias.indexOf(key as keyof PanGestureHandlerConfig) >= 0) {
239
+ return true
240
+ }
241
+ }
242
+ return false
243
+ }
244
+
245
+ public onAdditionalPointerAdd(event: IncomingEvent): void {
246
+ this.tracker.addToTracker(event);
247
+ super.onAdditionalPointerAdd(event);
248
+ this.tryBegin(event);
249
+ this.offset.add(this.lastPos).subtract(this.startPos)
250
+ this.lastPos = this.tracker.getLastAvgPos()
251
+ this.startPos = this.lastPos.clone()
252
+ if (this.tracker.getTrackedPointersCount() > (this.config.maxPointers ?? 10)) {
253
+ if (this.currentState === State.ACTIVE) {
254
+ this.cancel();
255
+ } else {
256
+ this.fail();
257
+ }
258
+ } else {
259
+ this.tryActivating();
260
+ }
261
+ }
262
+
263
+ public onPointerUp(event: IncomingEvent): void {
264
+ super.onPointerUp(event);
265
+ if (this.currentState === State.ACTIVE) {
266
+ this.lastPos = this.tracker.getLastAvgPos();
267
+ }
268
+ this.tracker.removeFromTracker(event.pointerId);
269
+ if (this.currentState === State.ACTIVE) {
270
+ this.end();
271
+ } else {
272
+ this.resetProgress();
273
+ this.fail();
274
+ }
275
+ }
276
+
277
+ public onAdditionalPointerRemove(event: IncomingEvent): void {
278
+ super.onAdditionalPointerRemove(event);
279
+ this.tracker.removeFromTracker(event.pointerId);
280
+ this.offset.add(this.lastPos).subtract(this.startPos)
281
+ this.lastPos = this.tracker.getLastAvgPos()
282
+ this.startPos = this.lastPos.clone()
283
+ if (
284
+ !(
285
+ this.currentState === State.ACTIVE &&
286
+ this.tracker.getTrackedPointersCount() < this.minPointers
287
+ )
288
+ ) {
289
+ this.tryActivating();
290
+ }
291
+ }
292
+
293
+ public onPointerMove(event: IncomingEvent): void {
294
+ this.tracker.track(event);
295
+ this.lastPos = this.tracker.getLastAvgPos()
296
+ this.velocity = this.tracker.getVelocity(event.pointerId)
297
+ this.tryActivating();
298
+ super.onPointerMove(event);
299
+ }
300
+
301
+ public onPointerOutOfBounds(event: IncomingEvent): void {
302
+ if (this.shouldCancelWhenOutside) {
303
+ return;
304
+ }
305
+ this.tracker.track(event);
306
+ this.lastPos = this.tracker.getLastAvgPos()
307
+ this.velocity = this.tracker.getVelocity(event.pointerId)
308
+ this.tryActivating();
309
+ if (this.currentState === State.ACTIVE) {
310
+ super.onPointerOutOfBounds(event);
311
+ }
312
+ }
313
+
314
+ protected transformNativeEvent() {
315
+ const rect = this.view.getBoundingRect();
316
+ const translation = this.getTranslation()
317
+ return {
318
+ translationX: translation.x,
319
+ translationY: translation.y,
320
+ absoluteX: this.tracker.getLastAvgX(),
321
+ absoluteY: this.tracker.getLastAvgY(),
322
+ velocityX: this.velocity.x,
323
+ velocityY: this.velocity.y,
324
+ x: this.tracker.getLastAvgX() - rect.x,
325
+ y: this.tracker.getLastAvgY() - rect.y,
326
+ };
327
+ }
328
+
329
+ protected onStateChange(newState: State, oldState: State) {
330
+ super.onStateChange(newState, oldState)
331
+ if (newState === State.BEGAN) {
332
+ this.unlockScrolls = this.scrollLocker.lockScrollContainingViewTag(this.view.getTag())
333
+ } else if (newState !== State.ACTIVE) {
334
+ this.unlockScrolls?.()
335
+ }
336
+ if (newState === State.ACTIVE) {
337
+ this.unlockRNGestureResponder = this.rnGestureResponder.lock(this.view.getTag())
338
+ } else {
339
+ this.unlockRNGestureResponder?.()
340
+ }
341
+ }
342
+ }