@react-native-oh-tpl/react-native-gesture-handler 2.14.16 → 2.14.17-rc.0

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 (95) hide show
  1. package/DrawerLayout/index.ts +2 -2
  2. package/Swipeable/index.ts +2 -2
  3. package/harmony/gesture_handler.har +0 -0
  4. package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
  5. package/lib/commonjs/components/GestureHandlerRootView.js.map +1 -1
  6. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  7. package/lib/commonjs/index.js.map +1 -1
  8. package/lib/commonjs/specs/NativeRNGestureHandlerModule.js.map +1 -1
  9. package/lib/commonjs/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  10. package/lib/commonjs/specs/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
  11. package/lib/module/RNGestureHandlerModule.js.map +1 -1
  12. package/lib/module/components/GestureHandlerRootView.js.map +1 -1
  13. package/lib/module/handlers/createHandler.js.map +1 -1
  14. package/lib/module/index.js.map +1 -1
  15. package/lib/module/specs/NativeRNGestureHandlerModule.js.map +1 -1
  16. package/lib/module/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  17. package/lib/module/specs/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
  18. package/lib/typescript/RNGestureHandlerModule.d.ts +2 -2
  19. package/lib/typescript/components/GestureHandlerRootView.d.ts +6 -6
  20. package/lib/typescript/handlers/createHandler.d.ts +11 -11
  21. package/lib/typescript/index.d.ts +47 -47
  22. package/lib/typescript/specs/NativeRNGestureHandlerModule.d.ts +14 -14
  23. package/lib/typescript/specs/RNGestureHandlerButtonNativeComponent.d.ts +14 -14
  24. package/lib/typescript/specs/RNGestureHandlerRootViewNativeComponent.d.ts +6 -6
  25. package/package.json +83 -78
  26. package/src/RNGestureHandlerModule.ts +4 -4
  27. package/src/components/GestureHandlerRootView.tsx +23 -23
  28. package/src/handlers/createHandler.tsx +534 -534
  29. package/src/index.ts +172 -172
  30. package/src/specs/NativeRNGestureHandlerModule.ts +26 -26
  31. package/src/specs/RNGestureHandlerButtonNativeComponent.ts +18 -18
  32. package/src/specs/RNGestureHandlerRootViewNativeComponent.ts +6 -6
  33. package/harmony/gesture_handler/BuildProfile.ets +0 -17
  34. package/harmony/gesture_handler/build-profile.json5 +0 -12
  35. package/harmony/gesture_handler/hvigorfile.ts +0 -2
  36. package/harmony/gesture_handler/index.ets +0 -2
  37. package/harmony/gesture_handler/oh-package-lock.json5 +0 -19
  38. package/harmony/gesture_handler/oh-package.json5 +0 -12
  39. package/harmony/gesture_handler/src/main/cpp/CMakeLists.txt +0 -8
  40. package/harmony/gesture_handler/src/main/cpp/GestureHandlerPackage.h +0 -12
  41. package/harmony/gesture_handler/src/main/cpp/RnohReactNativeHarmonyGestureHandlerPackage.cpp +0 -123
  42. package/harmony/gesture_handler/src/main/cpp/RnohReactNativeHarmonyGestureHandlerPackage.h +0 -15
  43. package/harmony/gesture_handler/src/main/cpp/componentInstances/RNGestureHandlerButtonComponentInstance.h +0 -27
  44. package/harmony/gesture_handler/src/main/cpp/componentInstances/RNGestureHandlerRootViewComponentInstance.h +0 -245
  45. package/harmony/gesture_handler/src/main/ets/RNOHPackage.ets +0 -17
  46. package/harmony/gesture_handler/src/main/ets/core/CircularBuffer.ts +0 -42
  47. package/harmony/gesture_handler/src/main/ets/core/GestureHandler.ts +0 -739
  48. package/harmony/gesture_handler/src/main/ets/core/GestureHandlerOrchestrator.ts +0 -344
  49. package/harmony/gesture_handler/src/main/ets/core/GestureHandlerRegistry.ts +0 -63
  50. package/harmony/gesture_handler/src/main/ets/core/IncomingEvent.ts +0 -78
  51. package/harmony/gesture_handler/src/main/ets/core/InteractionManager.ts +0 -144
  52. package/harmony/gesture_handler/src/main/ets/core/LeastSquareSolver.ts +0 -182
  53. package/harmony/gesture_handler/src/main/ets/core/Multiset.ts +0 -26
  54. package/harmony/gesture_handler/src/main/ets/core/OutgoingEvent.ts +0 -34
  55. package/harmony/gesture_handler/src/main/ets/core/OutgoingEventDispatcher.ts +0 -12
  56. package/harmony/gesture_handler/src/main/ets/core/PointerTracker.ts +0 -239
  57. package/harmony/gesture_handler/src/main/ets/core/RNGHError.ts +0 -5
  58. package/harmony/gesture_handler/src/main/ets/core/RNGHLogger.ts +0 -16
  59. package/harmony/gesture_handler/src/main/ets/core/State.ts +0 -47
  60. package/harmony/gesture_handler/src/main/ets/core/Vector2D.ts +0 -80
  61. package/harmony/gesture_handler/src/main/ets/core/VelocityTracker.ts +0 -106
  62. package/harmony/gesture_handler/src/main/ets/core/View.ts +0 -21
  63. package/harmony/gesture_handler/src/main/ets/core/ViewRegistry.ts +0 -7
  64. package/harmony/gesture_handler/src/main/ets/core/index.ts +0 -15
  65. package/harmony/gesture_handler/src/main/ets/detectors/ScaleGestureDetector.ts +0 -169
  66. package/harmony/gesture_handler/src/main/ets/gesture-handlers/FlingGestureHandler.ts +0 -219
  67. package/harmony/gesture_handler/src/main/ets/gesture-handlers/GestureHandlerFactory.ts +0 -67
  68. package/harmony/gesture_handler/src/main/ets/gesture-handlers/LongPressGestureHandler.ts +0 -139
  69. package/harmony/gesture_handler/src/main/ets/gesture-handlers/ManualGestureHandler.ts +0 -50
  70. package/harmony/gesture_handler/src/main/ets/gesture-handlers/NativeViewGestureHandler.ts +0 -124
  71. package/harmony/gesture_handler/src/main/ets/gesture-handlers/PanGestureHandler.ts +0 -375
  72. package/harmony/gesture_handler/src/main/ets/gesture-handlers/PinchGestureHandler.ts +0 -174
  73. package/harmony/gesture_handler/src/main/ets/gesture-handlers/RotationGestureHandler.ts +0 -172
  74. package/harmony/gesture_handler/src/main/ets/gesture-handlers/TapGestureHandler.ts +0 -216
  75. package/harmony/gesture_handler/src/main/ets/gesture-handlers/detectors/RotationGestureDetector.ts +0 -167
  76. package/harmony/gesture_handler/src/main/ets/gesture-handlers/index.ts +0 -1
  77. package/harmony/gesture_handler/src/main/ets/rnoh/GestureHandlerPackage.ts +0 -25
  78. package/harmony/gesture_handler/src/main/ets/rnoh/Logger.ts +0 -107
  79. package/harmony/gesture_handler/src/main/ets/rnoh/OutgoingEventDispatchers.ts +0 -94
  80. package/harmony/gesture_handler/src/main/ets/rnoh/RNGHRootViewController.ts +0 -196
  81. package/harmony/gesture_handler/src/main/ets/rnoh/RNGHView.ts +0 -89
  82. package/harmony/gesture_handler/src/main/ets/rnoh/RNGHViewController.ts +0 -255
  83. package/harmony/gesture_handler/src/main/ets/rnoh/RNGHViewRegistry.ts +0 -19
  84. package/harmony/gesture_handler/src/main/ets/rnoh/RNGestureHandlerModule.ts +0 -267
  85. package/harmony/gesture_handler/src/main/ets/rnoh/RNOHGestureResponder.ts +0 -15
  86. package/harmony/gesture_handler/src/main/ets/rnoh/RNOHScrollLocker.ts +0 -25
  87. package/harmony/gesture_handler/src/main/ets/rnoh/types.ts +0 -25
  88. package/harmony/gesture_handler/src/main/module.json5 +0 -9
  89. package/harmony/gesture_handler/src/main/resources/base/element/color.json +0 -8
  90. package/harmony/gesture_handler/src/main/resources/base/element/string.json +0 -16
  91. package/harmony/gesture_handler/src/main/resources/base/media/icon.png +0 -0
  92. package/harmony/gesture_handler/src/main/resources/base/profile/main_pages.json +0 -5
  93. package/harmony/gesture_handler/src/main/resources/en_US/element/string.json +0 -16
  94. package/harmony/gesture_handler/src/main/resources/zh_CN/element/string.json +0 -16
  95. package/harmony/gesture_handler/ts.ts +0 -2
@@ -1,344 +0,0 @@
1
- import { GestureHandler } from "./GestureHandler"
2
- import { State, getStateName } from "./State"
3
- import { PointerType } from "./IncomingEvent"
4
- import { RNGHLogger } from "./RNGHLogger"
5
-
6
- export class GestureHandlerOrchestrator {
7
- private awaitingHandlers: Set<GestureHandler> = new Set()
8
- private gestureHandlers: GestureHandler[] = []
9
- private handlersToCancel: GestureHandler[] = []
10
- private activationIndex: number = 0
11
-
12
- private logger: RNGHLogger
13
-
14
- constructor(logger: RNGHLogger) {
15
- this.logger = logger.cloneAndJoinPrefix("GestureHandlerOrchestrator")
16
- }
17
-
18
- public onHandlerStateChange(handler: GestureHandler, newState: State, oldState: State, sendIfDisabled?: boolean) {
19
- const logger =
20
- this.logger.cloneAndJoinPrefix(`onHandlerStateChange(handler=${handler.getTag()}, newState=${getStateName(newState)}, oldState=${getStateName(oldState)})`)
21
- logger.debug("start")
22
-
23
- if (!handler.isEnabled() && !sendIfDisabled) {
24
- return;
25
- }
26
-
27
- // this.handlingChangeSemaphore += 1;
28
-
29
- if (this.isFinishedState(newState)) {
30
- this.awaitingHandlers.forEach((otherHandler) => {
31
- if (otherHandler.shouldWaitFor(handler)) {
32
- if (newState === State.END) {
33
- otherHandler?.cancel();
34
- if (otherHandler.getState() === State.END) {
35
- // Handle edge case, where discrete gestures end immediately after activation thus
36
- // their state is set to END and when the gesture they are waiting for activates they
37
- // should be cancelled, however `cancel` was never sent as gestures were already in the END state.
38
- // Send synthetic BEGAN -> CANCELLED to properly handle JS logic
39
- otherHandler.sendEvent({ newState: State.CANCELLED, oldState: State.BEGAN });
40
- }
41
- otherHandler?.setAwaiting(false);
42
- } else {
43
- this.tryActivate(otherHandler);
44
- }
45
- }
46
- });
47
- }
48
-
49
- if (newState === State.ACTIVE) {
50
- this.tryActivate(handler);
51
- } else if (oldState === State.ACTIVE || oldState === State.END) {
52
- if (handler.isActive()) {
53
- handler.sendEvent({ newState, oldState });
54
- } else if (
55
- oldState === State.ACTIVE &&
56
- (newState === State.CANCELLED || newState === State.FAILED)
57
- ) {
58
- handler.sendEvent({ newState, oldState: State.BEGAN });
59
- }
60
- } else if (
61
- oldState !== State.UNDETERMINED ||
62
- newState !== State.CANCELLED
63
- ) {
64
- handler.sendEvent({ newState, oldState });
65
- }
66
-
67
- // this.handlingChangeSemaphore -= 1;
68
-
69
- this.cleanUpFinishedHandlers();
70
- if (!this.awaitingHandlers.has(handler)) {
71
- this.cleanupAwaitingHandlers(handler);
72
- }
73
- }
74
-
75
- private isFinishedState(state: State) {
76
- return [State.END, State.FAILED, State.CANCELLED].includes(state)
77
- }
78
-
79
- private tryActivate(handler: GestureHandler): void {
80
- const logger = this.logger.cloneAndJoinPrefix(`tryActivate(${handler.getTag()})`)
81
- logger.debug({
82
- gestureHandlers: this.gestureHandlers.map(gh => gh.getTag()),
83
- awaitingHandlers: Array.from(this.awaitingHandlers).map(gh => gh.getTag()),
84
- handlersToCancel: this.handlersToCancel.map(gh => gh.getTag())
85
- })
86
- if (this.shouldBeCancelledByFinishedHandler(handler)) {
87
- logger.debug("failed to activate - cancelling")
88
- handler.cancel();
89
- return;
90
- }
91
- if (this.hasOtherHandlerToWaitFor(handler)) {
92
- this.addAwaitingHandler(handler);
93
- logger.debug("request ignored - has other handler waiting")
94
- return;
95
- }
96
- const handlerState = handler.getState();
97
- if (handlerState === State.CANCELLED || handlerState === State.FAILED) {
98
- logger.debug("request ignored - handler is in cancelled or failed state")
99
- return;
100
- }
101
- if (this.shouldActivate(handler)) {
102
- logger.debug("activating")
103
- this.makeActive(handler);
104
- return;
105
- }
106
- if (handlerState === State.ACTIVE) {
107
- logger.debug("failed to activate - handler is already active, marking as fail")
108
- handler.fail();
109
- return;
110
- }
111
- if (handlerState === State.BEGAN) {
112
- logger.debug("handler is in BEGAN state but shouldActivate returned false - cancelling")
113
- handler.cancel();
114
- }
115
- }
116
-
117
- private shouldBeCancelledByFinishedHandler(
118
- handler: GestureHandler
119
- ): boolean {
120
- const shouldBeCancelled = (otherHandler: GestureHandler) => {
121
- return (
122
- handler.shouldWaitFor(otherHandler) &&
123
- otherHandler.getState() === State.END
124
- );
125
- };
126
- return this.gestureHandlers.some(shouldBeCancelled);
127
- }
128
-
129
- private hasOtherHandlerToWaitFor(handler: GestureHandler): boolean {
130
- const logger = this.logger.cloneAndJoinPrefix(`hasOtherHandlerToWaitFor(handler=${handler.getTag()})`)
131
- for (const otherHandler of this.gestureHandlers) {
132
- if (otherHandler === handler) {
133
- return false
134
- }
135
- if (!this.isFinishedState(otherHandler.getState()) && handler.shouldWaitFor(otherHandler)) {
136
- logger.debug("true")
137
- return true
138
- }
139
- }
140
- logger.debug("false")
141
- return false;
142
- }
143
-
144
- private addAwaitingHandler(handler: GestureHandler) {
145
- const logger = this.logger.cloneAndJoinPrefix(`addAwaitingHandler(handlerTag=${handler.getTag()})`)
146
- logger.debug({ awaitingHandlers: this.awaitingHandlers })
147
- if (!this.awaitingHandlers.has(handler)) {
148
- this.awaitingHandlers.add(handler)
149
- handler.setAwaiting(true)
150
- handler.setActivationIndex(this.activationIndex++)
151
- }
152
- }
153
-
154
- private shouldActivate(handler: GestureHandler) {
155
- for (const otherHandler of this.gestureHandlers) {
156
- if (this.shouldHandlerBeCancelledByOtherHandler({ handler, otherHandler })) {
157
- return false
158
- }
159
- }
160
- return true
161
- }
162
-
163
- private shouldHandlerBeCancelledByOtherHandler({ handler, otherHandler }: {
164
- handler: GestureHandler,
165
- otherHandler: GestureHandler
166
- }): boolean {
167
- const logger =
168
- this.logger.cloneAndJoinPrefix(`shouldHandlerBeCancelledByOtherHandler(${handler.getTag()}, ${otherHandler.getTag()})`)
169
- if (this.canRunSimultaneously(handler, otherHandler)) {
170
- logger.debug("false")
171
- return false;
172
- }
173
- if (handler !== otherHandler && (handler.isAwaiting() || handler.getState() === State.ACTIVE)) {
174
- const result = handler.shouldBeCancelledByOther(otherHandler)
175
- logger.debug(`${result} (1)`)
176
- return result
177
- }
178
- const result = this.checkOverlap(handler, otherHandler)
179
- logger.debug(`${result} (2)`)
180
- return result;
181
- }
182
-
183
- private canRunSimultaneously(handlerA: GestureHandler, handlerB: GestureHandler) {
184
- const logger = this.logger.cloneAndJoinPrefix("canRunSimultaneously")
185
- const result = handlerA === handlerB
186
- || handlerA.shouldRecognizeSimultaneously(handlerB)
187
- || handlerB.shouldRecognizeSimultaneously(handlerA)
188
-
189
- logger.debug({ result, handlerA: handlerA.getTag(), handlerB: handlerB.getTag() })
190
- return result
191
- }
192
-
193
- private checkOverlap(
194
- handler: GestureHandler,
195
- otherHandler: GestureHandler
196
- ): boolean {
197
- // If handlers don't have common pointers, default return value is false.
198
- // However, if at least on pointer overlaps with both handlers, we return true
199
- // This solves issue in overlapping parents example
200
-
201
- // TODO: Find better way to handle that issue, for example by activation order and handler cancelling
202
-
203
- const handlerPointers: number[] = handler.getTrackedPointersID();
204
- const otherPointers: number[] = otherHandler.getTrackedPointersID();
205
- let overlap = false;
206
- handlerPointers.forEach((pointer: number) => {
207
- const handlerX: number = handler.getTracker().getLastX(pointer);
208
- const handlerY: number = handler.getTracker().getLastY(pointer);
209
- if (
210
- handler.getView().isPositionInBounds({ x: handlerX, y: handlerY }) &&
211
- otherHandler.getView().isPositionInBounds({ x: handlerX, y: handlerY })
212
- ) {
213
- overlap = true;
214
- }
215
- });
216
- otherPointers.forEach((pointer: number) => {
217
- const otherX: number = otherHandler.getTracker().getLastX(pointer);
218
- const otherY: number = otherHandler.getTracker().getLastY(pointer);
219
- if (
220
- handler.getView().isPositionInBounds({ x: otherX, y: otherY }) &&
221
- otherHandler.getView().isPositionInBounds({ x: otherX, y: otherY })
222
- ) {
223
- overlap = true;
224
- }
225
- });
226
- return overlap;
227
- }
228
-
229
- private makeActive(handler: GestureHandler): void {
230
- handler.setActive(true)
231
- handler.setShouldResetProgress(true)
232
- handler.setActivationIndex(this.activationIndex++)
233
- for (const otherHandler of this.gestureHandlers) {
234
- if (this.shouldHandlerBeCancelledByOtherHandler({ handler: otherHandler, otherHandler: handler })) {
235
- this.handlersToCancel.push(otherHandler)
236
- }
237
- }
238
- for (let i = this.handlersToCancel.length - 1; i >= 0; --i) {
239
- this.handlersToCancel[i]?.cancel();
240
- }
241
- this.handlersToCancel = []
242
- for (const awaitingHandler of this.awaitingHandlers) {
243
- if (this.shouldHandlerBeCancelledByOtherHandler({ handler: awaitingHandler, otherHandler: handler })) {
244
- awaitingHandler.cancel();
245
- awaitingHandler.setAwaiting(true);
246
- }
247
- }
248
- const currentState = handler.getState()
249
- handler.sendEvent({ newState: State.ACTIVE, oldState: State.BEGAN })
250
- if (currentState !== State.ACTIVE) {
251
- handler.sendEvent({ newState: State.END, oldState: State.ACTIVE })
252
- if (currentState !== State.END) {
253
- handler.sendEvent({ newState: State.UNDETERMINED, oldState: State.END })
254
- }
255
- }
256
- if (handler.isAwaiting()) {
257
- handler.setAwaiting(false)
258
- this.awaitingHandlers.delete(handler)
259
- }
260
- }
261
-
262
- private cleanUpHandlers(handler: GestureHandler) {
263
- this.cleanUpFinishedHandlers()
264
- if (this.awaitingHandlers.has(handler)) {
265
- this.cleanupAwaitingHandlers(handler);
266
- }
267
- }
268
-
269
- private cleanUpFinishedHandlers(): void {
270
- for (let i = this.gestureHandlers.length - 1; i >= 0; --i) {
271
- const handler = this.gestureHandlers[i];
272
- if (!handler) {
273
- continue;
274
- }
275
- if (this.isFinishedState(handler.getState()) && !handler.isAwaiting()) {
276
- this.gestureHandlers.splice(i, 1);
277
- this.cleanUpHandler(handler);
278
- }
279
- }
280
- }
281
-
282
- private cleanupAwaitingHandlers(handler: GestureHandler): void {
283
- const logger = this.logger.cloneAndJoinPrefix(`cleanupAwaitingHandlers(handler=${handler.getTag()})`)
284
- logger.debug({ awaitingHandlers: this.awaitingHandlers })
285
- for (const awaitingHandler of this.awaitingHandlers) {
286
- if (
287
- awaitingHandler.isAwaiting() &&
288
- awaitingHandler.shouldWaitFor(handler)
289
- ) {
290
- this.cleanUpHandler(awaitingHandler);
291
- this.awaitingHandlers.delete(awaitingHandler)
292
- }
293
- }
294
- }
295
-
296
- private cleanUpHandler(handler: GestureHandler) {
297
- handler.reset();
298
- handler.setActive(false);
299
- handler.setAwaiting(false);
300
- handler.setActivationIndex(Number.MAX_VALUE);
301
- }
302
-
303
- public registerHandlerIfNotPresent(handler: GestureHandler) {
304
- this.logger.info(`registerHandlerIfNotPresent(${handler.getTag()})`)
305
- if (this.gestureHandlers.includes(handler)) {
306
- return;
307
- }
308
- this.gestureHandlers.push(handler);
309
- handler.setActive(false);
310
- handler.setAwaiting(false);
311
- handler.setActivationIndex(Number.MAX_SAFE_INTEGER);
312
- }
313
-
314
- /**
315
- This function is called when handler receives touchdown event
316
- If handler is using mouse or pen as a pointer and any handler receives touch event,
317
- mouse/pen event disappears - it doesn't send onPointerCancel nor onPointerUp (and others)
318
- This became a problem because handler was left at active state without any signal to end or fail
319
- To handle this, when new touch event is received, we loop through active handlers and check which type of
320
- pointer they're using. If there are any handler with mouse/pen as a pointer, we cancel them
321
- */
322
- public cancelMouseAndPenGestures(currentHandler: GestureHandler): void {
323
- this.logger.info("cancelMouseAndPenGestures")
324
- this.gestureHandlers.forEach((handler: GestureHandler) => {
325
- if (handler.getPointerType() !== PointerType.MOUSE && handler.getPointerType() !== PointerType.PEN) {
326
- return;
327
- }
328
-
329
- if (handler !== currentHandler) {
330
- handler.cancel();
331
- } else {
332
- // Handler that received touch event should have its pointer tracker reset
333
- // This allows handler to smoothly change from mouse/pen to touch
334
- // The drawback is, that when we try to use mouse/pen one more time, it doesn't send onPointerDown at the first time
335
- // so it is required to click two times to get handler to work
336
- //
337
- // However, handler will receive manually created onPointerEnter that is triggered in EventManager in onPointerMove method.
338
- // There may be possibility to use that fact to make handler respond properly to first mouse click
339
- handler.getTracker().resetTracker();
340
- }
341
- });
342
- }
343
- }
344
-
@@ -1,63 +0,0 @@
1
- import { GestureHandler } from "./GestureHandler"
2
- import { View } from "./View"
3
- import { RNGHLogger } from "./RNGHLogger"
4
- import { ViewRegistry } from "./ViewRegistry"
5
-
6
- export class GestureHandlerRegistry {
7
- private gestureHandlerByHandlerTag: Map<number, GestureHandler> = new Map()
8
- private gestureHandlersByViewTag: Map<number, Set<GestureHandler>> = new Map()
9
- private viewRegistry: ViewRegistry | undefined
10
- private logger: RNGHLogger
11
-
12
- constructor(viewRegistry: ViewRegistry | undefined, logger: RNGHLogger) {
13
- this.logger = logger.cloneAndJoinPrefix("GestureHandlerRegistry")
14
- this.viewRegistry = viewRegistry
15
- }
16
-
17
- public addGestureHandler(gestureHandler: GestureHandler) {
18
- this.gestureHandlerByHandlerTag.set(gestureHandler.getTag(), gestureHandler)
19
- }
20
-
21
- public bindGestureHandlerWithView(gestureHandlerTag: number, view: View) {
22
- this.logger.cloneAndJoinPrefix("bindGestureHandlerWithView").debug({gestureHandlerTag, viewTag: view.getTag()})
23
- const viewTag = view.getTag()
24
- if (!this.gestureHandlersByViewTag.has(viewTag))
25
- this.gestureHandlersByViewTag.set(viewTag, new Set())
26
- const gestureHandler = this.gestureHandlerByHandlerTag.get(gestureHandlerTag)
27
- this.gestureHandlersByViewTag.get(viewTag).add(gestureHandler)
28
- gestureHandler.onViewAttached(view)
29
- }
30
-
31
- public getGestureHandlersByViewTag(viewTag: number): GestureHandler[] {
32
- return Array.from(this.gestureHandlersByViewTag.get(viewTag) ?? [])
33
- }
34
-
35
- public removeGestureHandlerByHandlerTag(handlerTag: number) {
36
- const gestureHandler = this.gestureHandlerByHandlerTag.get(handlerTag)
37
- if (!gestureHandler) {
38
- return;
39
- }
40
- const viewTag = gestureHandler.getView()?.getTag();
41
- if (viewTag) {
42
- const gestureHandlers = this.gestureHandlersByViewTag.get(viewTag)
43
- if (gestureHandlers) {
44
- gestureHandlers.delete(gestureHandler)
45
- if (gestureHandlers.size === 0) {
46
- this.gestureHandlersByViewTag.delete(viewTag)
47
- this.viewRegistry?.deleteByTag(viewTag)
48
- }
49
- }
50
- }
51
- if (gestureHandler.getView()) {
52
- // Handler is in "prepared" state which means it is registered in the orchestrator and can
53
- // receive touch events. This means that before we remove it from the registry we need to
54
- // "cancel" it so that orchestrator does no longer keep a reference to it.
55
- gestureHandler.cancel()
56
- }
57
- this.gestureHandlerByHandlerTag.delete(handlerTag)
58
- }
59
-
60
- public getGestureHandlerByHandlerTag(handlerTag: number): GestureHandler {
61
- return this.gestureHandlerByHandlerTag.get(handlerTag)
62
- }
63
- }
@@ -1,78 +0,0 @@
1
- export interface HitSlop {
2
- left?: number;
3
- right?: number;
4
- top?: number;
5
- bottom?: number;
6
- horizontal?: number;
7
- vertical?: number;
8
- width?: number;
9
- height?: number;
10
- }
11
-
12
- const RIGHT = 1;
13
- const LEFT = 2;
14
- const UP = 4;
15
- const DOWN = 8;
16
-
17
- export const Directions = {
18
- RIGHT: RIGHT,
19
- LEFT: LEFT,
20
- UP: UP,
21
- DOWN: DOWN,
22
- } as const;
23
-
24
- export type Directions = typeof Directions[keyof typeof Directions];
25
-
26
- export const DiagonalDirections = {
27
- UP_RIGHT: UP | RIGHT,
28
- DOWN_RIGHT: DOWN | RIGHT,
29
- UP_LEFT: UP | LEFT,
30
- DOWN_LEFT: DOWN | LEFT,
31
- } as const;
32
-
33
- export type DiagonalDirections =
34
- typeof DiagonalDirections[keyof typeof DiagonalDirections];
35
-
36
- export enum PointerType {
37
- NONE = 'none',
38
- MOUSE = 'mouse',
39
- TOUCH = 'touch',
40
- PEN = 'pen',
41
- }
42
-
43
- export enum EventType {
44
- DOWN = "DOWN",
45
- ADDITIONAL_POINTER_DOWN = "ADDITIONAL_POINTER_DOWN",
46
- UP = "UP",
47
- ADDITIONAL_POINTER_UP = "ADDITIONAL_POINTER_UP",
48
- MOVE = "MOVE",
49
- ENTER = "ENTER",
50
- OUT = "OUT",
51
- CANCEL = "CANCEL",
52
- }
53
-
54
- export type Touch = {id: number, x: number, y: number, absoluteX: number, absoluteY: number}
55
-
56
- export enum TouchEventType {
57
- UNDETERMINED = 0,
58
- DOWN = 1,
59
- MOVE = 2,
60
- UP = 3,
61
- CANCELLED = 4,
62
- }
63
-
64
- export interface IncomingEvent {
65
- x: number;
66
- y: number;
67
- offsetX: number;
68
- offsetY: number;
69
- pointerId: number;
70
- eventType: EventType;
71
- pointerType: PointerType;
72
- buttons: number;
73
- time: number;
74
- allTouches?: Touch[];
75
- changedTouches?: Touch[];
76
- touchEventType?: TouchEventType;
77
- }
78
-
@@ -1,144 +0,0 @@
1
- import { GestureHandler, Handler, GestureConfig as Config, GHTag } from "./GestureHandler"
2
- import { RNGHLogger } from "./RNGHLogger"
3
-
4
- export class InteractionManager {
5
- private readonly waitForRelations: Map<GHTag, Set<GHTag>> = new Map()
6
- private readonly simultaneousRelations: Map<GHTag, GHTag[]> = new Map()
7
- private readonly blocksHandlersRelations: Map<GHTag, GHTag[]> = new Map();
8
-
9
- private logger: RNGHLogger
10
-
11
- constructor(logger: RNGHLogger) {
12
- this.logger = logger.cloneAndJoinPrefix("InteractionManager")
13
- }
14
-
15
- public configureInteractions(handler: GestureHandler, config: Config) {
16
- this.dropRelationsForHandlerWithTag(handler.getTag());
17
-
18
- if (config.waitFor) {
19
- const waitFor = new Set<GHTag>();
20
- config.waitFor.forEach((otherHandler: Handler): void => {
21
- // New API reference
22
- if (typeof otherHandler === 'number') {
23
- waitFor.add(otherHandler);
24
- } else {
25
- // Old API reference
26
- waitFor.add(otherHandler.handlerTag);
27
- }
28
- });
29
-
30
- this.waitForRelations.set(handler.getTag(), waitFor);
31
- }
32
-
33
- if (config.simultaneousHandlers) {
34
- const simultaneousHandlers: number[] = [];
35
- config.simultaneousHandlers.forEach((otherHandler: Handler): void => {
36
- if (typeof otherHandler === 'number') {
37
- simultaneousHandlers.push(otherHandler);
38
- } else {
39
- simultaneousHandlers.push(otherHandler.handlerTag);
40
- }
41
- });
42
-
43
- this.simultaneousRelations.set(handler.getTag(), simultaneousHandlers);
44
- }
45
-
46
- if (config.blocksHandlers) {
47
- const blocksHandlers: number[] = [];
48
- config.blocksHandlers.forEach((otherHandler: Handler): void => {
49
- if (typeof otherHandler === 'number') {
50
- blocksHandlers.push(otherHandler);
51
- } else {
52
- blocksHandlers.push(otherHandler.handlerTag);
53
- }
54
- });
55
- this.blocksHandlersRelations.set(handler.getTag(), blocksHandlers);
56
- }
57
- }
58
-
59
- public shouldWaitForHandlerFailure(
60
- handler: GestureHandler,
61
- otherHandler: GestureHandler
62
- ): boolean {
63
- const logger = this.logger.cloneAndJoinPrefix(`shouldWaitForHandlerFailure(${handler.getTag()}, ${otherHandler.getTag()})`)
64
- const waitFor = this.waitForRelations.get(
65
- handler.getTag()
66
- );
67
- logger.debug({waitFor: Array.from(waitFor ?? [])})
68
- if (!waitFor) {
69
- logger.debug("false")
70
- return false;
71
- }
72
-
73
- let shouldWait = false;
74
- waitFor.forEach((tag: number): void => {
75
- if (tag === otherHandler.getTag()) {
76
- shouldWait = true;
77
- return; //Returns from callback
78
- }
79
- });
80
- logger.debug(shouldWait)
81
- return shouldWait;
82
- }
83
-
84
- public shouldRecognizeSimultaneously(
85
- handler: GestureHandler,
86
- otherHandler: GestureHandler
87
- ): boolean {
88
- const logger = this.logger.cloneAndJoinPrefix(`shouldRecognizeSimultaneously(${handler.getTag()}, ${otherHandler.getTag()})`)
89
- const simultaneousHandlers: number[] | undefined =
90
- this.simultaneousRelations.get(handler.getTag());
91
- if (!simultaneousHandlers) {
92
- logger.debug(`false - Handler ${handler.getTag()} doesn't have simultaneousRelations specified`)
93
- return false;
94
- }
95
- let shouldRecognizeSimultaneously = false;
96
- simultaneousHandlers.forEach((tag: number): void => {
97
- if (tag === otherHandler.getTag()) {
98
- shouldRecognizeSimultaneously = true;
99
- return;
100
- }
101
- });
102
- logger.debug(`${shouldRecognizeSimultaneously} ${JSON.stringify({ simultaneousHandlers })}`)
103
- return shouldRecognizeSimultaneously;
104
- }
105
-
106
- public shouldRequireHandlerToWaitForFailure(
107
- handler: GestureHandler,
108
- otherHandler: GestureHandler
109
- ): boolean {
110
- const waitFor: number[] | undefined = this.blocksHandlersRelations.get(
111
- handler.getTag()
112
- );
113
-
114
- return (
115
- waitFor?.find((tag: number) => {
116
- return tag === otherHandler.getTag();
117
- }) !== undefined
118
- );
119
- }
120
-
121
- public shouldHandlerBeCancelledBy(
122
- handler: GestureHandler,
123
- otherHandler: GestureHandler
124
- ): boolean {
125
- const logger = this.logger.cloneAndJoinPrefix(`shouldHandlerBeCancelledBy(handler=${handler.getTag()}, otherHandler=${otherHandler.getTag()})`)
126
- // We check constructor name instead of using `instanceof` in order do avoid circular dependencies
127
- // const isNativeHandler =
128
- // otherHandler.constructor.name === 'NativeViewGestureHandler';
129
- // const isActive = otherHandler.getState() === State.ACTIVE;
130
- // const isButton = otherHandler.isButton?.() === true;
131
- // return isNativeHandler && isActive && !isButton;
132
- return false
133
- }
134
-
135
- public dropRelationsForHandlerWithTag(handlerTag: number): void {
136
- this.waitForRelations.delete(handlerTag);
137
- this.simultaneousRelations.delete(handlerTag);
138
- }
139
-
140
- public reset() {
141
- this.waitForRelations.clear();
142
- this.simultaneousRelations.clear();
143
- }
144
- }