react-native-gesture-handler 2.6.0 → 2.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/android/build.gradle +2 -2
  2. package/ios/RNGestureHandler.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  3. package/ios/RNGestureHandler.xcodeproj/project.xcworkspace/xcuserdata/jakubpiasecki.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  4. package/ios/RNGestureHandler.xcodeproj/xcuserdata/jakubpiasecki.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  5. package/lib/commonjs/EnableExperimentalWebImplementation.js +7 -0
  6. package/lib/commonjs/EnableExperimentalWebImplementation.js.map +1 -1
  7. package/lib/commonjs/RNGestureHandlerModule.js +1 -1
  8. package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
  9. package/lib/commonjs/RNGestureHandlerModule.macos.js +20 -9
  10. package/lib/commonjs/RNGestureHandlerModule.macos.js.map +1 -1
  11. package/lib/commonjs/RNGestureHandlerModule.web.js +23 -10
  12. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  13. package/lib/commonjs/components/GestureComponents.web.js +1 -1
  14. package/lib/commonjs/components/GestureComponents.web.js.map +1 -1
  15. package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js +1 -5
  16. package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  17. package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js +1 -5
  18. package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
  19. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  20. package/lib/commonjs/handlers/gestures/eventReceiver.js +14 -20
  21. package/lib/commonjs/handlers/gestures/eventReceiver.js.map +1 -1
  22. package/lib/commonjs/handlers/gestures/gestureStateManager.web.js +32 -0
  23. package/lib/commonjs/handlers/gestures/gestureStateManager.web.js.map +1 -0
  24. package/lib/commonjs/web/detectors/RotationGestureDetector.js +13 -17
  25. package/lib/commonjs/web/detectors/RotationGestureDetector.js.map +1 -1
  26. package/lib/commonjs/web/detectors/ScaleGestureDetector.js +3 -14
  27. package/lib/commonjs/web/detectors/ScaleGestureDetector.js.map +1 -1
  28. package/lib/commonjs/web/handlers/FlingGestureHandler.js +37 -12
  29. package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
  30. package/lib/commonjs/web/handlers/GestureHandler.js +282 -79
  31. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  32. package/lib/commonjs/web/handlers/LongPressGestureHandler.js +23 -18
  33. package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -1
  34. package/lib/commonjs/web/handlers/ManualGestureHandler.js +51 -0
  35. package/lib/commonjs/web/handlers/ManualGestureHandler.js.map +1 -0
  36. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +81 -22
  37. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
  38. package/lib/commonjs/web/handlers/PanGestureHandler.js +57 -40
  39. package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
  40. package/lib/commonjs/web/handlers/PinchGestureHandler.js +43 -34
  41. package/lib/commonjs/web/handlers/PinchGestureHandler.js.map +1 -1
  42. package/lib/commonjs/web/handlers/RotationGestureHandler.js +45 -39
  43. package/lib/commonjs/web/handlers/RotationGestureHandler.js.map +1 -1
  44. package/lib/commonjs/web/handlers/TapGestureHandler.js +52 -50
  45. package/lib/commonjs/web/handlers/TapGestureHandler.js.map +1 -1
  46. package/lib/commonjs/web/interfaces.js +22 -1
  47. package/lib/commonjs/web/interfaces.js.map +1 -1
  48. package/lib/commonjs/web/tools/EventManager.js +40 -96
  49. package/lib/commonjs/web/tools/EventManager.js.map +1 -1
  50. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +109 -30
  51. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  52. package/lib/commonjs/web/tools/InteractionManager.js +24 -10
  53. package/lib/commonjs/web/tools/InteractionManager.js.map +1 -1
  54. package/lib/commonjs/web/tools/NodeManager.js.map +1 -1
  55. package/lib/commonjs/web/tools/PointerEventManager.js +130 -0
  56. package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -0
  57. package/lib/commonjs/web/tools/PointerTracker.js +97 -7
  58. package/lib/commonjs/web/tools/PointerTracker.js.map +1 -1
  59. package/lib/commonjs/web/tools/TouchEventManager.js +138 -0
  60. package/lib/commonjs/web/tools/TouchEventManager.js.map +1 -0
  61. package/lib/commonjs/web/utils.js +15 -0
  62. package/lib/commonjs/web/utils.js.map +1 -0
  63. package/lib/module/EnableExperimentalWebImplementation.js +5 -0
  64. package/lib/module/EnableExperimentalWebImplementation.js.map +1 -1
  65. package/lib/module/RNGestureHandlerModule.js +1 -1
  66. package/lib/module/RNGestureHandlerModule.js.map +1 -1
  67. package/lib/module/RNGestureHandlerModule.macos.js +19 -10
  68. package/lib/module/RNGestureHandlerModule.macos.js.map +1 -1
  69. package/lib/module/RNGestureHandlerModule.web.js +22 -11
  70. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  71. package/lib/module/components/GestureComponents.web.js +1 -1
  72. package/lib/module/components/GestureComponents.web.js.map +1 -1
  73. package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js +1 -5
  74. package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  75. package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js +1 -4
  76. package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
  77. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  78. package/lib/module/handlers/gestures/eventReceiver.js +14 -20
  79. package/lib/module/handlers/gestures/eventReceiver.js.map +1 -1
  80. package/lib/module/handlers/gestures/gestureStateManager.web.js +21 -0
  81. package/lib/module/handlers/gestures/gestureStateManager.web.js.map +1 -0
  82. package/lib/module/web/detectors/RotationGestureDetector.js +13 -17
  83. package/lib/module/web/detectors/RotationGestureDetector.js.map +1 -1
  84. package/lib/module/web/detectors/ScaleGestureDetector.js +3 -14
  85. package/lib/module/web/detectors/ScaleGestureDetector.js.map +1 -1
  86. package/lib/module/web/handlers/FlingGestureHandler.js +37 -12
  87. package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
  88. package/lib/module/web/handlers/GestureHandler.js +276 -79
  89. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  90. package/lib/module/web/handlers/LongPressGestureHandler.js +23 -18
  91. package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -1
  92. package/lib/module/web/handlers/ManualGestureHandler.js +39 -0
  93. package/lib/module/web/handlers/ManualGestureHandler.js.map +1 -0
  94. package/lib/module/web/handlers/NativeViewGestureHandler.js +80 -22
  95. package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
  96. package/lib/module/web/handlers/PanGestureHandler.js +57 -41
  97. package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
  98. package/lib/module/web/handlers/PinchGestureHandler.js +43 -33
  99. package/lib/module/web/handlers/PinchGestureHandler.js.map +1 -1
  100. package/lib/module/web/handlers/RotationGestureHandler.js +45 -38
  101. package/lib/module/web/handlers/RotationGestureHandler.js.map +1 -1
  102. package/lib/module/web/handlers/TapGestureHandler.js +52 -50
  103. package/lib/module/web/handlers/TapGestureHandler.js.map +1 -1
  104. package/lib/module/web/interfaces.js +19 -0
  105. package/lib/module/web/interfaces.js.map +1 -1
  106. package/lib/module/web/tools/EventManager.js +39 -95
  107. package/lib/module/web/tools/EventManager.js.map +1 -1
  108. package/lib/module/web/tools/GestureHandlerOrchestrator.js +107 -30
  109. package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  110. package/lib/module/web/tools/InteractionManager.js +24 -10
  111. package/lib/module/web/tools/InteractionManager.js.map +1 -1
  112. package/lib/module/web/tools/NodeManager.js.map +1 -1
  113. package/lib/module/web/tools/PointerEventManager.js +116 -0
  114. package/lib/module/web/tools/PointerEventManager.js.map +1 -0
  115. package/lib/module/web/tools/PointerTracker.js +97 -7
  116. package/lib/module/web/tools/PointerTracker.js.map +1 -1
  117. package/lib/module/web/tools/TouchEventManager.js +124 -0
  118. package/lib/module/web/tools/TouchEventManager.js.map +1 -0
  119. package/lib/module/web/utils.js +8 -0
  120. package/lib/module/web/utils.js.map +1 -0
  121. package/lib/typescript/RNGestureHandlerModule.macos.d.ts +5 -2
  122. package/lib/typescript/RNGestureHandlerModule.web.d.ts +5 -2
  123. package/lib/typescript/components/touchables/TouchableNativeFeedback.android.d.ts +1 -1
  124. package/lib/typescript/fabric/RNGestureHandlerButtonNativeComponent.d.ts +3 -3
  125. package/lib/typescript/fabric/RNGestureHandlerRootViewNativeComponent.d.ts +3 -2
  126. package/lib/typescript/handlers/gestures/gestureStateManager.web.d.ts +4 -0
  127. package/lib/typescript/web/detectors/RotationGestureDetector.d.ts +7 -7
  128. package/lib/typescript/web/detectors/ScaleGestureDetector.d.ts +6 -7
  129. package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +12 -10
  130. package/lib/typescript/web/handlers/GestureHandler.d.ts +41 -32
  131. package/lib/typescript/web/handlers/LongPressGestureHandler.d.ts +6 -9
  132. package/lib/typescript/web/handlers/ManualGestureHandler.d.ts +11 -0
  133. package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +15 -6
  134. package/lib/typescript/web/handlers/PanGestureHandler.d.ts +15 -23
  135. package/lib/typescript/web/handlers/PinchGestureHandler.d.ts +11 -12
  136. package/lib/typescript/web/handlers/RotationGestureHandler.d.ts +12 -12
  137. package/lib/typescript/web/handlers/TapGestureHandler.d.ts +11 -14
  138. package/lib/typescript/web/interfaces.d.ts +50 -10
  139. package/lib/typescript/web/tools/EventManager.d.ts +28 -26
  140. package/lib/typescript/web/tools/GestureHandlerOrchestrator.d.ts +4 -2
  141. package/lib/typescript/web/tools/InteractionManager.d.ts +3 -0
  142. package/lib/typescript/web/tools/NodeManager.d.ts +3 -3
  143. package/lib/typescript/web/tools/PointerEventManager.d.ts +6 -0
  144. package/lib/typescript/web/tools/PointerTracker.d.ts +29 -5
  145. package/lib/typescript/web/tools/TouchEventManager.d.ts +6 -0
  146. package/lib/typescript/web/utils.d.ts +4 -0
  147. package/package.json +2 -2
  148. package/src/EnableExperimentalWebImplementation.ts +9 -0
  149. package/src/RNGestureHandlerModule.macos.ts +25 -10
  150. package/src/RNGestureHandlerModule.ts +4 -1
  151. package/src/RNGestureHandlerModule.web.ts +20 -7
  152. package/src/components/GestureComponents.web.tsx +1 -1
  153. package/src/fabric/RNGestureHandlerButtonNativeComponent.ts +2 -12
  154. package/src/fabric/RNGestureHandlerRootViewNativeComponent.ts +2 -8
  155. package/src/handlers/gestures/GestureDetector.tsx +0 -1
  156. package/src/handlers/gestures/eventReceiver.ts +23 -24
  157. package/src/handlers/gestures/gestureStateManager.web.ts +24 -0
  158. package/src/web/detectors/RotationGestureDetector.ts +20 -52
  159. package/src/web/detectors/ScaleGestureDetector.ts +9 -45
  160. package/src/web/handlers/FlingGestureHandler.ts +45 -22
  161. package/src/web/handlers/GestureHandler.ts +306 -97
  162. package/src/web/handlers/LongPressGestureHandler.ts +30 -24
  163. package/src/web/handlers/ManualGestureHandler.ts +39 -0
  164. package/src/web/handlers/NativeViewGestureHandler.ts +81 -24
  165. package/src/web/handlers/PanGestureHandler.ts +68 -53
  166. package/src/web/handlers/PinchGestureHandler.ts +47 -44
  167. package/src/web/handlers/RotationGestureHandler.ts +52 -51
  168. package/src/web/handlers/TapGestureHandler.ts +74 -56
  169. package/src/web/interfaces.ts +57 -10
  170. package/src/web/tools/EventManager.ts +58 -148
  171. package/src/web/tools/GestureHandlerOrchestrator.ts +115 -47
  172. package/src/web/tools/InteractionManager.ts +25 -9
  173. package/src/web/tools/NodeManager.ts +6 -6
  174. package/src/web/tools/PointerEventManager.ts +134 -0
  175. package/src/web/tools/PointerTracker.ts +120 -10
  176. package/src/web/tools/TouchEventManager.ts +167 -0
  177. package/src/web/utils.ts +8 -0
@@ -1,86 +1,37 @@
1
1
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
2
 
3
3
  /* eslint-disable @typescript-eslint/no-empty-function */
4
- import { EventTypes, MouseButtons } from '../interfaces';
5
4
  export default class EventManager {
6
5
  constructor(view) {
7
- _defineProperty(this, "activePointers", []);
8
-
9
6
  _defineProperty(this, "view", void 0);
10
7
 
11
- this.view = view;
12
- }
8
+ _defineProperty(this, "pointersInBounds", []);
13
9
 
14
- setListeners() {
15
- this.view.addEventListener('pointerdown', event => {
16
- if (!this.isPointerInBounds({
17
- x: event.clientX,
18
- y: event.clientY
19
- })) {
20
- return;
21
- }
22
-
23
- const adaptedEvent = this.mapEvent(event, EventTypes.DOWN);
24
- const target = event.target;
25
- target.setPointerCapture(adaptedEvent.pointerId);
26
- this.addActivePointer(adaptedEvent.pointerId);
27
- this.onPointerDown(adaptedEvent);
28
- });
29
- this.view.addEventListener('pointerup', event => {
30
- const adaptedEvent = this.mapEvent(event, EventTypes.UP);
31
- const target = event.target;
32
- this.onPointerUp(adaptedEvent);
33
- target.releasePointerCapture(adaptedEvent.pointerId);
34
- this.removeActivePointer(adaptedEvent.pointerId);
35
- });
36
- this.view.addEventListener('pointermove', event => {
37
- if (event.pointerType === 'mouse' && event.buttons !== MouseButtons.LEFT) {
38
- return;
39
- }
40
-
41
- const adaptedEvent = this.mapEvent(event, EventTypes.MOVE);
42
- const inBounds = this.isPointerInBounds({
43
- x: adaptedEvent.x,
44
- y: adaptedEvent.y
45
- });
46
- const pointerIndex = this.activePointers.indexOf(adaptedEvent.pointerId);
47
-
48
- if (inBounds) {
49
- if (pointerIndex < 0) {
50
- adaptedEvent.eventType = EventTypes.ENTER;
51
- this.onPointerEnter(adaptedEvent);
52
- this.addActivePointer(adaptedEvent.pointerId);
53
- } else {
54
- this.onPointerMove(adaptedEvent);
55
- }
56
- } else {
57
- if (pointerIndex >= 0) {
58
- adaptedEvent.eventType = EventTypes.OUT;
59
- this.onPointerOut(adaptedEvent);
60
- this.removeActivePointer(adaptedEvent.pointerId);
61
- } else {
62
- this.onPointerOutOfBounds(adaptedEvent);
63
- }
64
- }
65
- });
66
- this.view.addEventListener('pointercancel', event => {
67
- event.preventDefault();
68
- const adaptedEvent = this.mapEvent(event, EventTypes.CANCEL);
69
- this.onPointerCancel(adaptedEvent);
70
- });
10
+ _defineProperty(this, "activePointersCounter", void 0);
11
+
12
+ this.view = view;
13
+ this.activePointersCounter = 0;
71
14
  }
72
15
 
73
16
  onPointerDown(_event) {}
74
17
 
18
+ onPointerAdd(_event) {}
19
+
75
20
  onPointerUp(_event) {}
76
21
 
22
+ onPointerRemove(_event) {}
23
+
77
24
  onPointerMove(_event) {}
78
25
 
79
26
  onPointerOut(_event) {}
80
27
 
81
28
  onPointerEnter(_event) {}
82
29
 
83
- onPointerCancel(_event) {}
30
+ onPointerCancel(_event) {// When pointer cancel is triggered and there are more pointers on the view, only one pointer is cancelled
31
+ // Because we want all pointers to be cancelled by that event, we are doing it manually by reseting handler and changing activePointersCounter to 0
32
+ // Events that correspond to removing the pointer (pointerup, touchend) have condition, that they don't perform any action when activePointersCounter
33
+ // is equal to 0. This prevents counter from going to negative values, when pointers are removed from view after one of them has been cancelled
34
+ }
84
35
 
85
36
  onPointerOutOfBounds(_event) {}
86
37
 
@@ -88,10 +39,18 @@ export default class EventManager {
88
39
  this.onPointerDown = callback;
89
40
  }
90
41
 
42
+ setOnPointerAdd(callback) {
43
+ this.onPointerAdd = callback;
44
+ }
45
+
91
46
  setOnPointerUp(callback) {
92
47
  this.onPointerUp = callback;
93
48
  }
94
49
 
50
+ setOnPointerRemove(callback) {
51
+ this.onPointerRemove = callback;
52
+ }
53
+
95
54
  setOnPointerMove(callback) {
96
55
  this.onPointerMove = callback;
97
56
  }
@@ -112,48 +71,33 @@ export default class EventManager {
112
71
  this.onPointerOutOfBounds = callback;
113
72
  }
114
73
 
115
- mapEvent(event, eventType) {
116
- return {
117
- x: event.clientX,
118
- y: event.clientY,
119
- offsetX: event.offsetX,
120
- offsetY: event.offsetY,
121
- pointerId: event.pointerId,
122
- eventType: eventType,
123
- pointerType: event.pointerType,
124
- buttons: event.buttons,
125
- time: event.timeStamp
126
- };
127
- }
128
-
129
- isPointerInBounds({
130
- x,
131
- y
132
- }) {
133
- if (!this.view) {
134
- return false;
135
- }
136
-
137
- const rect = this.view.getBoundingClientRect();
138
- return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;
139
- }
140
-
141
- addActivePointer(pointerId) {
142
- if (this.activePointers.indexOf(pointerId) >= 0) {
74
+ markAsInBounds(pointerId) {
75
+ if (this.pointersInBounds.indexOf(pointerId) >= 0) {
143
76
  return;
144
77
  }
145
78
 
146
- this.activePointers.push(pointerId);
79
+ this.pointersInBounds.push(pointerId);
147
80
  }
148
81
 
149
- removeActivePointer(pointerId) {
150
- const index = this.activePointers.indexOf(pointerId);
82
+ markAsOutOfBounds(pointerId) {
83
+ const index = this.pointersInBounds.indexOf(pointerId);
151
84
 
152
85
  if (index < 0) {
153
86
  return;
154
87
  }
155
88
 
156
- this.activePointers.splice(index, 1);
89
+ this.pointersInBounds.splice(index, 1);
90
+ }
91
+
92
+ resetManager() {
93
+ // Reseting activePointersCounter is necessary to make gestures such as pinch work properly
94
+ // There are gestures that end when there is still one active pointer (like pinch/rotation)
95
+ // When these gestures end, they are reset, but they still receive events from pointer that is active
96
+ // This causes trouble, since only onPointerDown registers gesture in orchestrator, and while gestures receive
97
+ // Events from active pointer after they finished, next pointerdown event will be registered as additional pointer, not the first one
98
+ // This casues trouble like gestures getting stuck in END state, even though they should have gone to UNDETERMINED
99
+ this.activePointersCounter = 0;
100
+ this.pointersInBounds = [];
157
101
  }
158
102
 
159
103
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["EventManager.ts"],"names":["EventTypes","MouseButtons","EventManager","constructor","view","setListeners","addEventListener","event","isPointerInBounds","x","clientX","y","clientY","adaptedEvent","mapEvent","DOWN","target","setPointerCapture","pointerId","addActivePointer","onPointerDown","UP","onPointerUp","releasePointerCapture","removeActivePointer","pointerType","buttons","LEFT","MOVE","inBounds","pointerIndex","activePointers","indexOf","eventType","ENTER","onPointerEnter","onPointerMove","OUT","onPointerOut","onPointerOutOfBounds","preventDefault","CANCEL","onPointerCancel","_event","setOnPointerDown","callback","setOnPointerUp","setOnPointerMove","setOnPointerOut","setOnPointerEnter","setOnPointerCancel","setOnPointerOutOfBounds","offsetX","offsetY","time","timeStamp","rect","getBoundingClientRect","left","right","top","bottom","push","index","splice"],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-empty-function */\n\nimport { EventTypes, AdaptedPointerEvent, MouseButtons } from '../interfaces';\n\nexport default class EventManager {\n private activePointers: number[] = [];\n private readonly view: HTMLElement;\n\n constructor(view: HTMLElement) {\n this.view = view;\n }\n\n public setListeners() {\n this.view.addEventListener('pointerdown', (event: PointerEvent): void => {\n if (\n !this.isPointerInBounds({\n x: event.clientX,\n y: event.clientY,\n })\n ) {\n return;\n }\n\n const adaptedEvent: AdaptedPointerEvent = this.mapEvent(\n event,\n EventTypes.DOWN\n );\n const target = event.target as HTMLElement;\n\n target.setPointerCapture(adaptedEvent.pointerId);\n this.addActivePointer(adaptedEvent.pointerId);\n this.onPointerDown(adaptedEvent);\n });\n\n this.view.addEventListener('pointerup', (event: PointerEvent): void => {\n const adaptedEvent: AdaptedPointerEvent = this.mapEvent(\n event,\n EventTypes.UP\n );\n const target = event.target as HTMLElement;\n\n this.onPointerUp(adaptedEvent);\n target.releasePointerCapture(adaptedEvent.pointerId);\n this.removeActivePointer(adaptedEvent.pointerId);\n });\n\n this.view.addEventListener('pointermove', (event: PointerEvent): void => {\n if (\n event.pointerType === 'mouse' &&\n event.buttons !== MouseButtons.LEFT\n ) {\n return;\n }\n\n const adaptedEvent: AdaptedPointerEvent = this.mapEvent(\n event,\n EventTypes.MOVE\n );\n\n const inBounds: boolean = this.isPointerInBounds({\n x: adaptedEvent.x,\n y: adaptedEvent.y,\n });\n\n const pointerIndex: number = this.activePointers.indexOf(\n adaptedEvent.pointerId\n );\n\n if (inBounds) {\n if (pointerIndex < 0) {\n adaptedEvent.eventType = EventTypes.ENTER;\n this.onPointerEnter(adaptedEvent);\n this.addActivePointer(adaptedEvent.pointerId);\n } else {\n this.onPointerMove(adaptedEvent);\n }\n } else {\n if (pointerIndex >= 0) {\n adaptedEvent.eventType = EventTypes.OUT;\n this.onPointerOut(adaptedEvent);\n this.removeActivePointer(adaptedEvent.pointerId);\n } else {\n this.onPointerOutOfBounds(adaptedEvent);\n }\n }\n });\n\n this.view.addEventListener('pointercancel', (event: PointerEvent): void => {\n event.preventDefault();\n\n const adaptedEvent: AdaptedPointerEvent = this.mapEvent(\n event,\n EventTypes.CANCEL\n );\n\n this.onPointerCancel(adaptedEvent);\n });\n }\n\n private onPointerDown(_event: AdaptedPointerEvent): void {}\n private onPointerUp(_event: AdaptedPointerEvent): void {}\n private onPointerMove(_event: AdaptedPointerEvent): void {}\n private onPointerOut(_event: AdaptedPointerEvent): void {}\n private onPointerEnter(_event: AdaptedPointerEvent): void {}\n private onPointerCancel(_event: AdaptedPointerEvent): void {}\n private onPointerOutOfBounds(_event: AdaptedPointerEvent): void {}\n\n public setOnPointerDown(\n callback: (event: AdaptedPointerEvent) => void\n ): void {\n this.onPointerDown = callback;\n }\n public setOnPointerUp(callback: (event: AdaptedPointerEvent) => void): void {\n this.onPointerUp = callback;\n }\n public setOnPointerMove(\n callback: (event: AdaptedPointerEvent) => void\n ): void {\n this.onPointerMove = callback;\n }\n public setOnPointerOut(callback: (event: AdaptedPointerEvent) => void): void {\n this.onPointerOut = callback;\n }\n public setOnPointerEnter(\n callback: (event: AdaptedPointerEvent) => void\n ): void {\n this.onPointerEnter = callback;\n }\n public setOnPointerCancel(\n callback: (event: AdaptedPointerEvent) => void\n ): void {\n this.onPointerCancel = callback;\n }\n public setOnPointerOutOfBounds(\n callback: (event: AdaptedPointerEvent) => void\n ): void {\n this.onPointerOutOfBounds = callback;\n }\n\n private mapEvent(\n event: PointerEvent,\n eventType: EventTypes\n ): AdaptedPointerEvent {\n return {\n x: event.clientX,\n y: event.clientY,\n offsetX: event.offsetX,\n offsetY: event.offsetY,\n pointerId: event.pointerId,\n eventType: eventType,\n pointerType: event.pointerType,\n buttons: event.buttons,\n time: event.timeStamp,\n };\n }\n\n public isPointerInBounds({ x, y }: { x: number; y: number }): boolean {\n if (!this.view) {\n return false;\n }\n\n const rect: DOMRect = this.view.getBoundingClientRect();\n\n return (\n x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom\n );\n }\n\n private addActivePointer(pointerId: number): void {\n if (this.activePointers.indexOf(pointerId) >= 0) {\n return;\n }\n\n this.activePointers.push(pointerId);\n }\n\n private removeActivePointer(pointerId: number): void {\n const index: number = this.activePointers.indexOf(pointerId);\n\n if (index < 0) {\n return;\n }\n\n this.activePointers.splice(index, 1);\n }\n}\n"]}
1
+ {"version":3,"sources":["EventManager.ts"],"names":["EventManager","constructor","view","activePointersCounter","onPointerDown","_event","onPointerAdd","onPointerUp","onPointerRemove","onPointerMove","onPointerOut","onPointerEnter","onPointerCancel","onPointerOutOfBounds","setOnPointerDown","callback","setOnPointerAdd","setOnPointerUp","setOnPointerRemove","setOnPointerMove","setOnPointerOut","setOnPointerEnter","setOnPointerCancel","setOnPointerOutOfBounds","markAsInBounds","pointerId","pointersInBounds","indexOf","push","markAsOutOfBounds","index","splice","resetManager"],"mappings":";;AAAA;AAGA,eAAe,MAAeA,YAAf,CAA4B;AAKzCC,EAAAA,WAAW,CAACC,IAAD,EAAoB;AAAA;;AAAA,8CAHQ,EAGR;;AAAA;;AAC7B,SAAKA,IAAL,GAAYA,IAAZ;AACA,SAAKC,qBAAL,GAA6B,CAA7B;AACD;;AAUSC,EAAAA,aAAa,CAACC,MAAD,EAA6B,CAAE;;AAC5CC,EAAAA,YAAY,CAACD,MAAD,EAA6B,CAAE;;AAC3CE,EAAAA,WAAW,CAACF,MAAD,EAA6B,CAAE;;AAC1CG,EAAAA,eAAe,CAACH,MAAD,EAA6B,CAAE;;AAC9CI,EAAAA,aAAa,CAACJ,MAAD,EAA6B,CAAE;;AAC5CK,EAAAA,YAAY,CAACL,MAAD,EAA6B,CAAE;;AAC3CM,EAAAA,cAAc,CAACN,MAAD,EAA6B,CAAE;;AAC7CO,EAAAA,eAAe,CAACP,MAAD,EAA6B,CACpD;AACA;AACA;AACA;AACD;;AACSQ,EAAAA,oBAAoB,CAACR,MAAD,EAA6B,CAAE;;AAEtDS,EAAAA,gBAAgB,CAACC,QAAD,EAAgD;AACrE,SAAKX,aAAL,GAAqBW,QAArB;AACD;;AACMC,EAAAA,eAAe,CAACD,QAAD,EAAgD;AACpE,SAAKT,YAAL,GAAoBS,QAApB;AACD;;AACME,EAAAA,cAAc,CAACF,QAAD,EAAgD;AACnE,SAAKR,WAAL,GAAmBQ,QAAnB;AACD;;AACMG,EAAAA,kBAAkB,CAACH,QAAD,EAAgD;AACvE,SAAKP,eAAL,GAAuBO,QAAvB;AACD;;AACMI,EAAAA,gBAAgB,CAACJ,QAAD,EAAgD;AACrE,SAAKN,aAAL,GAAqBM,QAArB;AACD;;AACMK,EAAAA,eAAe,CAACL,QAAD,EAAgD;AACpE,SAAKL,YAAL,GAAoBK,QAApB;AACD;;AACMM,EAAAA,iBAAiB,CAACN,QAAD,EAAgD;AACtE,SAAKJ,cAAL,GAAsBI,QAAtB;AACD;;AACMO,EAAAA,kBAAkB,CAACP,QAAD,EAAgD;AACvE,SAAKH,eAAL,GAAuBG,QAAvB;AACD;;AACMQ,EAAAA,uBAAuB,CAC5BR,QAD4B,EAEtB;AACN,SAAKF,oBAAL,GAA4BE,QAA5B;AACD;;AAESS,EAAAA,cAAc,CAACC,SAAD,EAA0B;AAChD,QAAI,KAAKC,gBAAL,CAAsBC,OAAtB,CAA8BF,SAA9B,KAA4C,CAAhD,EAAmD;AACjD;AACD;;AAED,SAAKC,gBAAL,CAAsBE,IAAtB,CAA2BH,SAA3B;AACD;;AAESI,EAAAA,iBAAiB,CAACJ,SAAD,EAA0B;AACnD,UAAMK,KAAa,GAAG,KAAKJ,gBAAL,CAAsBC,OAAtB,CAA8BF,SAA9B,CAAtB;;AAEA,QAAIK,KAAK,GAAG,CAAZ,EAAe;AACb;AACD;;AAED,SAAKJ,gBAAL,CAAsBK,MAAtB,CAA6BD,KAA7B,EAAoC,CAApC;AACD;;AAEME,EAAAA,YAAY,GAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AAEA,SAAK7B,qBAAL,GAA6B,CAA7B;AACA,SAAKuB,gBAAL,GAAwB,EAAxB;AACD;;AA3FwC","sourcesContent":["/* eslint-disable @typescript-eslint/no-empty-function */\nimport { AdaptedEvent, EventTypes, TouchEventType } from '../interfaces';\n\nexport default abstract class EventManager {\n protected readonly view: HTMLElement;\n protected pointersInBounds: number[] = [];\n protected activePointersCounter: number;\n\n constructor(view: HTMLElement) {\n this.view = view;\n this.activePointersCounter = 0;\n }\n\n public abstract setListeners(): void;\n protected abstract mapEvent(\n event: Event,\n eventType: EventTypes,\n index?: number,\n touchEventType?: TouchEventType\n ): AdaptedEvent;\n\n protected onPointerDown(_event: AdaptedEvent): void {}\n protected onPointerAdd(_event: AdaptedEvent): void {}\n protected onPointerUp(_event: AdaptedEvent): void {}\n protected onPointerRemove(_event: AdaptedEvent): void {}\n protected onPointerMove(_event: AdaptedEvent): void {}\n protected onPointerOut(_event: AdaptedEvent): void {}\n protected onPointerEnter(_event: AdaptedEvent): void {}\n protected onPointerCancel(_event: AdaptedEvent): void {\n // When pointer cancel is triggered and there are more pointers on the view, only one pointer is cancelled\n // Because we want all pointers to be cancelled by that event, we are doing it manually by reseting handler and changing activePointersCounter to 0\n // Events that correspond to removing the pointer (pointerup, touchend) have condition, that they don't perform any action when activePointersCounter\n // is equal to 0. This prevents counter from going to negative values, when pointers are removed from view after one of them has been cancelled\n }\n protected onPointerOutOfBounds(_event: AdaptedEvent): void {}\n\n public setOnPointerDown(callback: (event: AdaptedEvent) => void): void {\n this.onPointerDown = callback;\n }\n public setOnPointerAdd(callback: (event: AdaptedEvent) => void): void {\n this.onPointerAdd = callback;\n }\n public setOnPointerUp(callback: (event: AdaptedEvent) => void): void {\n this.onPointerUp = callback;\n }\n public setOnPointerRemove(callback: (event: AdaptedEvent) => void): void {\n this.onPointerRemove = callback;\n }\n public setOnPointerMove(callback: (event: AdaptedEvent) => void): void {\n this.onPointerMove = callback;\n }\n public setOnPointerOut(callback: (event: AdaptedEvent) => void): void {\n this.onPointerOut = callback;\n }\n public setOnPointerEnter(callback: (event: AdaptedEvent) => void): void {\n this.onPointerEnter = callback;\n }\n public setOnPointerCancel(callback: (event: AdaptedEvent) => void): void {\n this.onPointerCancel = callback;\n }\n public setOnPointerOutOfBounds(\n callback: (event: AdaptedEvent) => void\n ): void {\n this.onPointerOutOfBounds = callback;\n }\n\n protected markAsInBounds(pointerId: number): void {\n if (this.pointersInBounds.indexOf(pointerId) >= 0) {\n return;\n }\n\n this.pointersInBounds.push(pointerId);\n }\n\n protected markAsOutOfBounds(pointerId: number): void {\n const index: number = this.pointersInBounds.indexOf(pointerId);\n\n if (index < 0) {\n return;\n }\n\n this.pointersInBounds.splice(index, 1);\n }\n\n public resetManager(): void {\n // Reseting activePointersCounter is necessary to make gestures such as pinch work properly\n // There are gestures that end when there is still one active pointer (like pinch/rotation)\n // When these gestures end, they are reset, but they still receive events from pointer that is active\n // This causes trouble, since only onPointerDown registers gesture in orchestrator, and while gestures receive\n // Events from active pointer after they finished, next pointerdown event will be registered as additional pointer, not the first one\n // This casues trouble like gestures getting stuck in END state, even though they should have gone to UNDETERMINED\n\n this.activePointersCounter = 0;\n this.pointersInBounds = [];\n }\n}\n"]}
@@ -1,7 +1,9 @@
1
1
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
2
 
3
3
  import { State } from '../../State';
4
+ import { PointerType } from '../interfaces';
4
5
  import PointerTracker from './PointerTracker';
6
+ import { isPointerInBounds } from '../utils';
5
7
  export default class GestureHandlerOrchestrator {
6
8
  // Private beacuse of Singleton
7
9
  // eslint-disable-next-line no-useless-constructor, @typescript-eslint/no-empty-function
@@ -30,6 +32,12 @@ export default class GestureHandlerOrchestrator {
30
32
  handler.setActivationIndex(Number.MAX_VALUE);
31
33
  }
32
34
 
35
+ removeHandlerFromOrchestrator(handler) {
36
+ this.gestureHandlers.splice(this.gestureHandlers.indexOf(handler), 1);
37
+ this.awaitingHandlers.splice(this.awaitingHandlers.indexOf(handler), 1);
38
+ this.handlersToCancel.splice(this.handlersToCancel.indexOf(handler), 1);
39
+ }
40
+
33
41
  cleanupFinishedHandlers() {
34
42
  for (let i = this.gestureHandlers.length - 1; i >= 0; --i) {
35
43
  const handler = this.gestureHandlers[i];
@@ -56,14 +64,35 @@ export default class GestureHandlerOrchestrator {
56
64
  return hasToWait;
57
65
  }
58
66
 
59
- tryActivate(handler, event) {
67
+ tryActivate(handler) {
60
68
  if (this.hasOtherHandlerToWaitFor(handler)) {
61
69
  this.addAwaitingHandler(handler);
62
- } else {
63
- this.makeActive(handler, event);
70
+ } else if (handler.getState() !== State.CANCELLED && handler.getState() !== State.FAILED) {
71
+ if (this.shouldActivate(handler)) {
72
+ this.makeActive(handler);
73
+ } else {
74
+ switch (handler.getState()) {
75
+ case State.ACTIVE:
76
+ handler.fail();
77
+ break;
78
+
79
+ case State.BEGAN:
80
+ handler.cancel();
81
+ }
82
+ }
64
83
  }
65
84
  }
66
85
 
86
+ shouldActivate(handler) {
87
+ for (const otherHandler of this.gestureHandlers) {
88
+ if (this.shouldHandlerBeCancelledBy(handler, otherHandler)) {
89
+ return false;
90
+ }
91
+ }
92
+
93
+ return true;
94
+ }
95
+
67
96
  cleanupAwaitingHandlers(handler) {
68
97
  for (let i = 0; i < this.awaitingHandlers.length; ++i) {
69
98
  if (!this.awaitingHandlers[i].isAwaiting() && this.shouldHandlerWaitForOther(this.awaitingHandlers[i], handler)) {
@@ -73,32 +102,45 @@ export default class GestureHandlerOrchestrator {
73
102
  }
74
103
  }
75
104
 
76
- onHandlerStateChange(handler, newState, oldState, event) {
105
+ onHandlerStateChange(handler, newState, oldState, sendIfDisabled) {
106
+ if (!handler.isEnabled() && !sendIfDisabled) {
107
+ return;
108
+ }
109
+
77
110
  this.handlingChangeSemaphore += 1;
78
111
 
79
112
  if (this.isFinished(newState)) {
80
113
  this.awaitingHandlers.forEach(otherHandler => {
81
114
  if (this.shouldHandlerWaitForOther(otherHandler, handler)) {
82
115
  if (newState === State.END) {
83
- otherHandler === null || otherHandler === void 0 ? void 0 : otherHandler.cancel(event);
116
+ otherHandler === null || otherHandler === void 0 ? void 0 : otherHandler.cancel();
117
+
118
+ if (otherHandler.getState() === State.END) {
119
+ // Handle edge case, where discrete gestures end immediately after activation thus
120
+ // their state is set to END and when the gesture they are waiting for activates they
121
+ // should be cancelled, however `cancel` was never sent as gestures were already in the END state.
122
+ // Send synthetic BEGAN -> CANCELLED to properly handle JS logic
123
+ otherHandler.sendEvent(State.CANCELLED, State.BEGAN);
124
+ }
125
+
84
126
  otherHandler === null || otherHandler === void 0 ? void 0 : otherHandler.setAwaiting(false);
85
127
  } else {
86
- this.tryActivate(otherHandler, event);
128
+ this.tryActivate(otherHandler);
87
129
  }
88
130
  }
89
131
  });
90
132
  }
91
133
 
92
134
  if (newState === State.ACTIVE) {
93
- this.tryActivate(handler, event);
135
+ this.tryActivate(handler);
94
136
  } else if (oldState === State.ACTIVE || oldState === State.END) {
95
137
  if (handler.isActive()) {
96
- handler.sendEvent(event, newState, oldState);
97
- } else if (oldState === State.ACTIVE) {
98
- handler.sendEvent(event, newState, State.BEGAN);
138
+ handler.sendEvent(newState, oldState);
139
+ } else if (oldState === State.ACTIVE && (newState === State.CANCELLED || newState === State.FAILED)) {
140
+ handler.sendEvent(newState, State.BEGAN);
99
141
  }
100
142
  } else if (oldState !== State.UNDETERMINED || newState !== State.CANCELLED) {
101
- handler.sendEvent(event, newState, oldState);
143
+ handler.sendEvent(newState, oldState);
102
144
  }
103
145
 
104
146
  this.handlingChangeSemaphore -= 1;
@@ -109,7 +151,7 @@ export default class GestureHandlerOrchestrator {
109
151
  }
110
152
  }
111
153
 
112
- makeActive(handler, event) {
154
+ makeActive(handler) {
113
155
  const currentState = handler.getState();
114
156
  handler.setActive(true);
115
157
  handler.setShouldResetProgress(true);
@@ -124,28 +166,33 @@ export default class GestureHandlerOrchestrator {
124
166
  for (let i = this.handlersToCancel.length - 1; i >= 0; --i) {
125
167
  var _this$handlersToCance;
126
168
 
127
- (_this$handlersToCance = this.handlersToCancel[i]) === null || _this$handlersToCance === void 0 ? void 0 : _this$handlersToCance.cancel(event);
169
+ (_this$handlersToCance = this.handlersToCancel[i]) === null || _this$handlersToCance === void 0 ? void 0 : _this$handlersToCance.cancel();
128
170
  }
129
171
 
130
172
  this.awaitingHandlers.forEach(otherHandler => {
131
173
  if (this.shouldHandlerBeCancelledBy(otherHandler, handler)) {
132
- otherHandler === null || otherHandler === void 0 ? void 0 : otherHandler.cancel(event);
174
+ otherHandler === null || otherHandler === void 0 ? void 0 : otherHandler.cancel();
133
175
  otherHandler === null || otherHandler === void 0 ? void 0 : otherHandler.setAwaiting(true);
134
176
  }
135
177
  });
136
- handler.sendEvent(event, State.ACTIVE, State.BEGAN);
178
+ handler.sendEvent(State.ACTIVE, State.BEGAN);
137
179
 
138
180
  if (currentState !== State.ACTIVE) {
139
- handler.sendEvent(event, State.END, State.ACTIVE);
181
+ handler.sendEvent(State.END, State.ACTIVE);
140
182
 
141
183
  if (currentState !== State.END) {
142
- handler.sendEvent(event, State.UNDETERMINED, State.END);
184
+ handler.sendEvent(State.UNDETERMINED, State.END);
143
185
  }
144
186
  }
145
187
 
146
188
  if (handler.isAwaiting()) {
147
189
  handler.setAwaiting(false);
148
- handler.end(event);
190
+
191
+ for (let i = 0; i < this.awaitingHandlers.length; ++i) {
192
+ if (this.awaitingHandlers[i] === handler) {
193
+ this.awaitingHandlers.splice(i, 1);
194
+ }
195
+ }
149
196
  }
150
197
 
151
198
  this.handlersToCancel = [];
@@ -197,13 +244,6 @@ export default class GestureHandlerOrchestrator {
197
244
  }
198
245
 
199
246
  shouldHandlerBeCancelledBy(handler, otherHandler) {
200
- const handlerPointers = handler.getTrackedPointersID();
201
- const otherPointers = otherHandler.getTrackedPointersID();
202
-
203
- if (!PointerTracker.shareCommonPointers(handlerPointers, otherPointers) && handler.getView() !== otherHandler.getView()) {
204
- return this.checkOverlap(handler, otherHandler);
205
- }
206
-
207
247
  if (this.canRunSimultaneously(handler, otherHandler)) {
208
248
  return false;
209
249
  }
@@ -213,6 +253,13 @@ export default class GestureHandlerOrchestrator {
213
253
  return handler.shouldBeCancelledByOther(otherHandler);
214
254
  }
215
255
 
256
+ const handlerPointers = handler.getTrackedPointersID();
257
+ const otherPointers = otherHandler.getTrackedPointersID();
258
+
259
+ if (!PointerTracker.shareCommonPointers(handlerPointers, otherPointers) && handler.getView() !== otherHandler.getView()) {
260
+ return this.checkOverlap(handler, otherHandler);
261
+ }
262
+
216
263
  return true;
217
264
  }
218
265
 
@@ -228,10 +275,10 @@ export default class GestureHandlerOrchestrator {
228
275
  const handlerX = handler.getTracker().getLastX(pointer);
229
276
  const handlerY = handler.getTracker().getLastY(pointer);
230
277
 
231
- if (handler.getEventManager().isPointerInBounds({
278
+ if (isPointerInBounds(handler.getView(), {
232
279
  x: handlerX,
233
280
  y: handlerY
234
- }) && otherHandler.getEventManager().isPointerInBounds({
281
+ }) && isPointerInBounds(otherHandler.getView(), {
235
282
  x: handlerX,
236
283
  y: handlerY
237
284
  })) {
@@ -242,10 +289,10 @@ export default class GestureHandlerOrchestrator {
242
289
  const otherX = otherHandler.getTracker().getLastX(pointer);
243
290
  const otherY = otherHandler.getTracker().getLastY(pointer);
244
291
 
245
- if (handler.getEventManager().isPointerInBounds({
292
+ if (isPointerInBounds(handler.getView(), {
246
293
  x: otherX,
247
294
  y: otherY
248
- }) && otherHandler.getEventManager().isPointerInBounds({
295
+ }) && isPointerInBounds(otherHandler.getView(), {
249
296
  x: otherX,
250
297
  y: otherY
251
298
  })) {
@@ -257,10 +304,40 @@ export default class GestureHandlerOrchestrator {
257
304
 
258
305
  isFinished(state) {
259
306
  return state === State.END || state === State.FAILED || state === State.CANCELLED;
307
+ } // This function is called when handler receives touchdown event
308
+ // If handler is using mouse or pen as a pointer and any handler receives touch event,
309
+ // mouse/pen event dissappears - it doesn't send onPointerCancel nor onPointerUp (and others)
310
+ // This became a problem because handler was left at active state without any signal to end or fail
311
+ // To handle this, when new touch event is received, we loop through active handlers and check which type of
312
+ // pointer they're using. If there are any handler with mouse/pen as a pointer, we cancel them
313
+
314
+
315
+ cancelMouseAndPenGestures(currentHandler) {
316
+ this.gestureHandlers.forEach(handler => {
317
+ if (handler.getPointerType() !== PointerType.MOUSE && handler.getPointerType() !== PointerType.PEN) {
318
+ return;
319
+ }
320
+
321
+ if (handler !== currentHandler) {
322
+ handler.cancel();
323
+ } else {
324
+ // Handler that received touch event should have its pointer tracker reset
325
+ // This allows handler to smoothly change from mouse/pen to touch
326
+ // The drawback is, that when we try to use mouse/pen one more time, it doesn't send onPointerDown at the first time
327
+ // so it is required to click two times to get handler to work
328
+ //
329
+ // However, handler will receive manually created onPointerEnter that is triggered in EventManager in onPointerMove method.
330
+ // There may be possibility to use that fact to make handler respond properly to first mouse click
331
+ handler.getTracker().resetTracker();
332
+ }
333
+ });
260
334
  }
261
335
 
262
336
  static getInstance() {
263
- if (!GestureHandlerOrchestrator.instance) GestureHandlerOrchestrator.instance = new GestureHandlerOrchestrator();
337
+ if (!GestureHandlerOrchestrator.instance) {
338
+ GestureHandlerOrchestrator.instance = new GestureHandlerOrchestrator();
339
+ }
340
+
264
341
  return GestureHandlerOrchestrator.instance;
265
342
  }
266
343
 
@@ -1 +1 @@
1
- {"version":3,"sources":["GestureHandlerOrchestrator.ts"],"names":["State","PointerTracker","GestureHandlerOrchestrator","constructor","scheduleFinishedHandlersCleanup","handlingChangeSemaphore","cleanupFinishedHandlers","cleanHandler","handler","reset","setActive","setAwaiting","setActivationIndex","Number","MAX_VALUE","i","gestureHandlers","length","isFinished","getState","isAwaiting","splice","hasOtherHandlerToWaitFor","hasToWait","forEach","otherHandler","shouldHandlerWaitForOther","tryActivate","event","addAwaitingHandler","makeActive","cleanupAwaitingHandlers","awaitingHandlers","onHandlerStateChange","newState","oldState","END","cancel","ACTIVE","isActive","sendEvent","BEGAN","UNDETERMINED","CANCELLED","indexOf","currentState","setShouldResetProgress","activationIndex","shouldHandlerBeCancelledBy","handlersToCancel","push","end","alreadyExists","recordHandlerIfNotPresent","MAX_SAFE_INTEGER","shouldWaitForHandlerFailure","shouldRequireToWaitForFailure","canRunSimultaneously","gh1","gh2","shouldRecognizeSimultaneously","handlerPointers","getTrackedPointersID","otherPointers","shareCommonPointers","getView","checkOverlap","shouldBeCancelledByOther","overlap","pointer","handlerX","getTracker","getLastX","handlerY","getLastY","getEventManager","isPointerInBounds","x","y","otherX","otherY","state","FAILED","getInstance","instance"],"mappings":"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","sourcesContent":["import { State } from '../../State';\nimport { AdaptedPointerEvent } from '../interfaces';\n\nimport GestureHandler from '../handlers/GestureHandler';\nimport PointerTracker from './PointerTracker';\n\nexport default class GestureHandlerOrchestrator {\n private static instance: GestureHandlerOrchestrator;\n\n private gestureHandlers: GestureHandler[] = [];\n private awaitingHandlers: GestureHandler[] = [];\n private handlersToCancel: GestureHandler[] = [];\n\n private handlingChangeSemaphore = 0;\n private activationIndex = 0;\n\n // Private beacuse of Singleton\n // eslint-disable-next-line no-useless-constructor, @typescript-eslint/no-empty-function\n private constructor() {}\n\n private scheduleFinishedHandlersCleanup(): void {\n if (this.handlingChangeSemaphore === 0) {\n this.cleanupFinishedHandlers();\n }\n }\n\n private cleanHandler(handler: GestureHandler): void {\n handler.reset();\n handler.setActive(false);\n handler.setAwaiting(false);\n handler.setActivationIndex(Number.MAX_VALUE);\n }\n\n private cleanupFinishedHandlers(): void {\n for (let i = this.gestureHandlers.length - 1; i >= 0; --i) {\n const handler = this.gestureHandlers[i];\n if (!handler) {\n continue;\n }\n\n if (this.isFinished(handler.getState()) && !handler.isAwaiting()) {\n this.gestureHandlers.splice(i, 1);\n\n this.cleanHandler(handler);\n }\n }\n }\n\n private hasOtherHandlerToWaitFor(handler: GestureHandler): boolean {\n let hasToWait = false;\n this.gestureHandlers.forEach((otherHandler) => {\n if (\n otherHandler &&\n !this.isFinished(otherHandler.getState()) &&\n this.shouldHandlerWaitForOther(handler, otherHandler)\n ) {\n hasToWait = true;\n return;\n }\n });\n\n return hasToWait;\n }\n\n private tryActivate(\n handler: GestureHandler,\n event: AdaptedPointerEvent\n ): void {\n if (this.hasOtherHandlerToWaitFor(handler)) {\n this.addAwaitingHandler(handler);\n } else {\n this.makeActive(handler, event);\n }\n }\n\n private cleanupAwaitingHandlers(handler: GestureHandler): void {\n for (let i = 0; i < this.awaitingHandlers.length; ++i) {\n if (\n !this.awaitingHandlers[i].isAwaiting() &&\n this.shouldHandlerWaitForOther(this.awaitingHandlers[i], handler)\n ) {\n this.cleanHandler(this.awaitingHandlers[i]);\n this.awaitingHandlers.splice(i, 1);\n }\n }\n }\n\n public onHandlerStateChange(\n handler: GestureHandler,\n newState: State,\n oldState: State,\n event: AdaptedPointerEvent\n ): void {\n this.handlingChangeSemaphore += 1;\n\n if (this.isFinished(newState)) {\n this.awaitingHandlers.forEach((otherHandler) => {\n if (this.shouldHandlerWaitForOther(otherHandler, handler)) {\n if (newState === State.END) {\n otherHandler?.cancel(event);\n otherHandler?.setAwaiting(false);\n } else {\n this.tryActivate(otherHandler, event);\n }\n }\n });\n }\n\n if (newState === State.ACTIVE) {\n this.tryActivate(handler, event);\n } else if (oldState === State.ACTIVE || oldState === State.END) {\n if (handler.isActive()) {\n handler.sendEvent(event, newState, oldState);\n } else if (oldState === State.ACTIVE) {\n handler.sendEvent(event, newState, State.BEGAN);\n }\n } else if (\n oldState !== State.UNDETERMINED ||\n newState !== State.CANCELLED\n ) {\n handler.sendEvent(event, newState, oldState);\n }\n\n this.handlingChangeSemaphore -= 1;\n\n this.scheduleFinishedHandlersCleanup();\n\n if (this.awaitingHandlers.indexOf(handler) < 0) {\n this.cleanupAwaitingHandlers(handler);\n }\n }\n\n private makeActive(\n handler: GestureHandler,\n event: AdaptedPointerEvent\n ): void {\n const currentState = handler.getState();\n\n handler.setActive(true);\n handler.setShouldResetProgress(true);\n handler.setActivationIndex(this.activationIndex++);\n\n this.gestureHandlers.forEach((otherHandler) => {\n // Order of arguments is correct - we check whether current handler should cancel existing handlers\n if (this.shouldHandlerBeCancelledBy(otherHandler, handler)) {\n this.handlersToCancel.push(otherHandler);\n }\n });\n\n for (let i = this.handlersToCancel.length - 1; i >= 0; --i) {\n this.handlersToCancel[i]?.cancel(event);\n }\n this.awaitingHandlers.forEach((otherHandler) => {\n if (this.shouldHandlerBeCancelledBy(otherHandler, handler)) {\n otherHandler?.cancel(event);\n otherHandler?.setAwaiting(true);\n }\n });\n\n handler.sendEvent(event, State.ACTIVE, State.BEGAN);\n\n if (currentState !== State.ACTIVE) {\n handler.sendEvent(event, State.END, State.ACTIVE);\n if (currentState !== State.END) {\n handler.sendEvent(event, State.UNDETERMINED, State.END);\n }\n }\n\n if (handler.isAwaiting()) {\n handler.setAwaiting(false);\n handler.end(event);\n }\n\n this.handlersToCancel = [];\n }\n\n private addAwaitingHandler(handler: GestureHandler): void {\n let alreadyExists = false;\n\n this.awaitingHandlers.forEach((otherHandler) => {\n if (otherHandler === handler) {\n alreadyExists = true;\n return;\n }\n });\n\n if (alreadyExists) {\n return;\n }\n\n this.awaitingHandlers.push(handler);\n\n handler.setAwaiting(true);\n handler.setActivationIndex(this.activationIndex++);\n }\n\n public recordHandlerIfNotPresent(handler: GestureHandler): void {\n let alreadyExists = false;\n\n this.gestureHandlers.forEach((otherHandler) => {\n if (otherHandler === handler) {\n alreadyExists = true;\n return;\n }\n });\n\n if (alreadyExists) {\n return;\n }\n\n this.gestureHandlers.push(handler);\n\n handler.setActive(false);\n handler.setAwaiting(false);\n handler.setActivationIndex(Number.MAX_SAFE_INTEGER);\n }\n\n private shouldHandlerWaitForOther(\n handler: GestureHandler,\n otherHandler: GestureHandler\n ): boolean {\n return (\n handler !== otherHandler &&\n (handler.shouldWaitForHandlerFailure(otherHandler) ||\n otherHandler.shouldRequireToWaitForFailure(handler))\n );\n }\n\n private canRunSimultaneously(\n gh1: GestureHandler,\n gh2: GestureHandler\n ): boolean {\n return (\n gh1 === gh2 ||\n gh1.shouldRecognizeSimultaneously(gh2) ||\n gh2.shouldRecognizeSimultaneously(gh1)\n );\n }\n\n private shouldHandlerBeCancelledBy(\n handler: GestureHandler,\n otherHandler: GestureHandler\n ): boolean {\n const handlerPointers: number[] = handler.getTrackedPointersID();\n const otherPointers: number[] = otherHandler.getTrackedPointersID();\n\n if (\n !PointerTracker.shareCommonPointers(handlerPointers, otherPointers) &&\n handler.getView() !== otherHandler.getView()\n ) {\n return this.checkOverlap(handler, otherHandler);\n }\n\n if (this.canRunSimultaneously(handler, otherHandler)) {\n return false;\n }\n\n if (\n handler !== otherHandler &&\n (handler.isAwaiting() || handler.getState() === State.ACTIVE)\n ) {\n // For now it always returns false\n return handler.shouldBeCancelledByOther(otherHandler);\n }\n\n return true;\n }\n\n private checkOverlap(\n handler: GestureHandler,\n otherHandler: GestureHandler\n ): boolean {\n // If handlers don't have common pointers, default return value is false.\n // However, if at least on pointer overlaps with both handlers, we return true\n // This solves issue in overlapping parents example\n\n // TODO: Find better way to handle that issue, for example by activation order and handler cancelling\n\n const handlerPointers: number[] = handler.getTrackedPointersID();\n const otherPointers: number[] = otherHandler.getTrackedPointersID();\n\n let overlap = false;\n\n handlerPointers.forEach((pointer: number) => {\n const handlerX: number = handler.getTracker().getLastX(pointer);\n const handlerY: number = handler.getTracker().getLastY(pointer);\n\n if (\n handler\n .getEventManager()\n .isPointerInBounds({ x: handlerX, y: handlerY }) &&\n otherHandler\n .getEventManager()\n .isPointerInBounds({ x: handlerX, y: handlerY })\n ) {\n overlap = true;\n }\n });\n\n otherPointers.forEach((pointer: number) => {\n const otherX: number = otherHandler.getTracker().getLastX(pointer);\n const otherY: number = otherHandler.getTracker().getLastY(pointer);\n\n if (\n handler.getEventManager().isPointerInBounds({ x: otherX, y: otherY }) &&\n otherHandler\n .getEventManager()\n .isPointerInBounds({ x: otherX, y: otherY })\n ) {\n overlap = true;\n }\n });\n\n return overlap;\n }\n\n private isFinished(state: State): boolean {\n return (\n state === State.END || state === State.FAILED || state === State.CANCELLED\n );\n }\n\n public static getInstance(): GestureHandlerOrchestrator {\n if (!GestureHandlerOrchestrator.instance)\n GestureHandlerOrchestrator.instance = new GestureHandlerOrchestrator();\n\n return GestureHandlerOrchestrator.instance;\n }\n}\n"]}
1
+ {"version":3,"sources":["GestureHandlerOrchestrator.ts"],"names":["State","PointerType","PointerTracker","isPointerInBounds","GestureHandlerOrchestrator","constructor","scheduleFinishedHandlersCleanup","handlingChangeSemaphore","cleanupFinishedHandlers","cleanHandler","handler","reset","setActive","setAwaiting","setActivationIndex","Number","MAX_VALUE","removeHandlerFromOrchestrator","gestureHandlers","splice","indexOf","awaitingHandlers","handlersToCancel","i","length","isFinished","getState","isAwaiting","hasOtherHandlerToWaitFor","hasToWait","forEach","otherHandler","shouldHandlerWaitForOther","tryActivate","addAwaitingHandler","CANCELLED","FAILED","shouldActivate","makeActive","ACTIVE","fail","BEGAN","cancel","shouldHandlerBeCancelledBy","cleanupAwaitingHandlers","onHandlerStateChange","newState","oldState","sendIfDisabled","isEnabled","END","sendEvent","isActive","UNDETERMINED","currentState","setShouldResetProgress","activationIndex","push","alreadyExists","recordHandlerIfNotPresent","MAX_SAFE_INTEGER","shouldWaitForHandlerFailure","shouldRequireToWaitForFailure","canRunSimultaneously","gh1","gh2","shouldRecognizeSimultaneously","shouldBeCancelledByOther","handlerPointers","getTrackedPointersID","otherPointers","shareCommonPointers","getView","checkOverlap","overlap","pointer","handlerX","getTracker","getLastX","handlerY","getLastY","x","y","otherX","otherY","state","cancelMouseAndPenGestures","currentHandler","getPointerType","MOUSE","PEN","resetTracker","getInstance","instance"],"mappings":"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","sourcesContent":["import { State } from '../../State';\nimport { PointerType } from '../interfaces';\n\nimport GestureHandler from '../handlers/GestureHandler';\nimport PointerTracker from './PointerTracker';\nimport { isPointerInBounds } from '../utils';\n\nexport default class GestureHandlerOrchestrator {\n private static instance: GestureHandlerOrchestrator;\n\n private gestureHandlers: GestureHandler[] = [];\n private awaitingHandlers: GestureHandler[] = [];\n private handlersToCancel: GestureHandler[] = [];\n\n private handlingChangeSemaphore = 0;\n private activationIndex = 0;\n\n // Private beacuse of Singleton\n // eslint-disable-next-line no-useless-constructor, @typescript-eslint/no-empty-function\n private constructor() {}\n\n private scheduleFinishedHandlersCleanup(): void {\n if (this.handlingChangeSemaphore === 0) {\n this.cleanupFinishedHandlers();\n }\n }\n\n private cleanHandler(handler: GestureHandler): void {\n handler.reset();\n handler.setActive(false);\n handler.setAwaiting(false);\n handler.setActivationIndex(Number.MAX_VALUE);\n }\n\n public removeHandlerFromOrchestrator(handler: GestureHandler): void {\n this.gestureHandlers.splice(this.gestureHandlers.indexOf(handler), 1);\n this.awaitingHandlers.splice(this.awaitingHandlers.indexOf(handler), 1);\n this.handlersToCancel.splice(this.handlersToCancel.indexOf(handler), 1);\n }\n\n private cleanupFinishedHandlers(): void {\n for (let i = this.gestureHandlers.length - 1; i >= 0; --i) {\n const handler = this.gestureHandlers[i];\n\n if (!handler) {\n continue;\n }\n if (this.isFinished(handler.getState()) && !handler.isAwaiting()) {\n this.gestureHandlers.splice(i, 1);\n\n this.cleanHandler(handler);\n }\n }\n }\n\n private hasOtherHandlerToWaitFor(handler: GestureHandler): boolean {\n let hasToWait = false;\n this.gestureHandlers.forEach((otherHandler) => {\n if (\n otherHandler &&\n !this.isFinished(otherHandler.getState()) &&\n this.shouldHandlerWaitForOther(handler, otherHandler)\n ) {\n hasToWait = true;\n return;\n }\n });\n\n return hasToWait;\n }\n\n private tryActivate(handler: GestureHandler): void {\n if (this.hasOtherHandlerToWaitFor(handler)) {\n this.addAwaitingHandler(handler);\n } else if (\n handler.getState() !== State.CANCELLED &&\n handler.getState() !== State.FAILED\n ) {\n if (this.shouldActivate(handler)) {\n this.makeActive(handler);\n } else {\n switch (handler.getState()) {\n case State.ACTIVE:\n handler.fail();\n break;\n case State.BEGAN:\n handler.cancel();\n }\n }\n }\n }\n\n private shouldActivate(handler: GestureHandler): boolean {\n for (const otherHandler of this.gestureHandlers) {\n if (this.shouldHandlerBeCancelledBy(handler, otherHandler)) {\n return false;\n }\n }\n\n return true;\n }\n\n private cleanupAwaitingHandlers(handler: GestureHandler): void {\n for (let i = 0; i < this.awaitingHandlers.length; ++i) {\n if (\n !this.awaitingHandlers[i].isAwaiting() &&\n this.shouldHandlerWaitForOther(this.awaitingHandlers[i], handler)\n ) {\n this.cleanHandler(this.awaitingHandlers[i]);\n this.awaitingHandlers.splice(i, 1);\n }\n }\n }\n\n public onHandlerStateChange(\n handler: GestureHandler,\n newState: State,\n oldState: State,\n sendIfDisabled?: boolean\n ): void {\n if (!handler.isEnabled() && !sendIfDisabled) {\n return;\n }\n\n this.handlingChangeSemaphore += 1;\n\n if (this.isFinished(newState)) {\n this.awaitingHandlers.forEach((otherHandler) => {\n if (this.shouldHandlerWaitForOther(otherHandler, handler)) {\n if (newState === State.END) {\n otherHandler?.cancel();\n if (otherHandler.getState() === State.END) {\n // Handle edge case, where discrete gestures end immediately after activation thus\n // their state is set to END and when the gesture they are waiting for activates they\n // should be cancelled, however `cancel` was never sent as gestures were already in the END state.\n // Send synthetic BEGAN -> CANCELLED to properly handle JS logic\n otherHandler.sendEvent(State.CANCELLED, State.BEGAN);\n }\n otherHandler?.setAwaiting(false);\n } else {\n this.tryActivate(otherHandler);\n }\n }\n });\n }\n\n if (newState === State.ACTIVE) {\n this.tryActivate(handler);\n } else if (oldState === State.ACTIVE || oldState === State.END) {\n if (handler.isActive()) {\n handler.sendEvent(newState, oldState);\n } else if (\n oldState === State.ACTIVE &&\n (newState === State.CANCELLED || newState === State.FAILED)\n ) {\n handler.sendEvent(newState, State.BEGAN);\n }\n } else if (\n oldState !== State.UNDETERMINED ||\n newState !== State.CANCELLED\n ) {\n handler.sendEvent(newState, oldState);\n }\n\n this.handlingChangeSemaphore -= 1;\n\n this.scheduleFinishedHandlersCleanup();\n\n if (this.awaitingHandlers.indexOf(handler) < 0) {\n this.cleanupAwaitingHandlers(handler);\n }\n }\n\n private makeActive(handler: GestureHandler): void {\n const currentState = handler.getState();\n\n handler.setActive(true);\n handler.setShouldResetProgress(true);\n handler.setActivationIndex(this.activationIndex++);\n\n this.gestureHandlers.forEach((otherHandler) => {\n // Order of arguments is correct - we check whether current handler should cancel existing handlers\n\n if (this.shouldHandlerBeCancelledBy(otherHandler, handler)) {\n this.handlersToCancel.push(otherHandler);\n }\n });\n\n for (let i = this.handlersToCancel.length - 1; i >= 0; --i) {\n this.handlersToCancel[i]?.cancel();\n }\n this.awaitingHandlers.forEach((otherHandler) => {\n if (this.shouldHandlerBeCancelledBy(otherHandler, handler)) {\n otherHandler?.cancel();\n otherHandler?.setAwaiting(true);\n }\n });\n\n handler.sendEvent(State.ACTIVE, State.BEGAN);\n\n if (currentState !== State.ACTIVE) {\n handler.sendEvent(State.END, State.ACTIVE);\n if (currentState !== State.END) {\n handler.sendEvent(State.UNDETERMINED, State.END);\n }\n }\n\n if (handler.isAwaiting()) {\n handler.setAwaiting(false);\n for (let i = 0; i < this.awaitingHandlers.length; ++i) {\n if (this.awaitingHandlers[i] === handler) {\n this.awaitingHandlers.splice(i, 1);\n }\n }\n }\n\n this.handlersToCancel = [];\n }\n\n private addAwaitingHandler(handler: GestureHandler): void {\n let alreadyExists = false;\n\n this.awaitingHandlers.forEach((otherHandler) => {\n if (otherHandler === handler) {\n alreadyExists = true;\n return;\n }\n });\n\n if (alreadyExists) {\n return;\n }\n\n this.awaitingHandlers.push(handler);\n\n handler.setAwaiting(true);\n handler.setActivationIndex(this.activationIndex++);\n }\n\n public recordHandlerIfNotPresent(handler: GestureHandler): void {\n let alreadyExists = false;\n\n this.gestureHandlers.forEach((otherHandler) => {\n if (otherHandler === handler) {\n alreadyExists = true;\n return;\n }\n });\n\n if (alreadyExists) {\n return;\n }\n\n this.gestureHandlers.push(handler);\n\n handler.setActive(false);\n handler.setAwaiting(false);\n handler.setActivationIndex(Number.MAX_SAFE_INTEGER);\n }\n\n private shouldHandlerWaitForOther(\n handler: GestureHandler,\n otherHandler: GestureHandler\n ): boolean {\n return (\n handler !== otherHandler &&\n (handler.shouldWaitForHandlerFailure(otherHandler) ||\n otherHandler.shouldRequireToWaitForFailure(handler))\n );\n }\n\n private canRunSimultaneously(\n gh1: GestureHandler,\n gh2: GestureHandler\n ): boolean {\n return (\n gh1 === gh2 ||\n gh1.shouldRecognizeSimultaneously(gh2) ||\n gh2.shouldRecognizeSimultaneously(gh1)\n );\n }\n\n private shouldHandlerBeCancelledBy(\n handler: GestureHandler,\n otherHandler: GestureHandler\n ): boolean {\n if (this.canRunSimultaneously(handler, otherHandler)) {\n return false;\n }\n\n if (\n handler !== otherHandler &&\n (handler.isAwaiting() || handler.getState() === State.ACTIVE)\n ) {\n // For now it always returns false\n return handler.shouldBeCancelledByOther(otherHandler);\n }\n\n const handlerPointers: number[] = handler.getTrackedPointersID();\n const otherPointers: number[] = otherHandler.getTrackedPointersID();\n\n if (\n !PointerTracker.shareCommonPointers(handlerPointers, otherPointers) &&\n handler.getView() !== otherHandler.getView()\n ) {\n return this.checkOverlap(handler, otherHandler);\n }\n\n return true;\n }\n\n private checkOverlap(\n handler: GestureHandler,\n otherHandler: GestureHandler\n ): boolean {\n // If handlers don't have common pointers, default return value is false.\n // However, if at least on pointer overlaps with both handlers, we return true\n // This solves issue in overlapping parents example\n\n // TODO: Find better way to handle that issue, for example by activation order and handler cancelling\n\n const handlerPointers: number[] = handler.getTrackedPointersID();\n const otherPointers: number[] = otherHandler.getTrackedPointersID();\n\n let overlap = false;\n\n handlerPointers.forEach((pointer: number) => {\n const handlerX: number = handler.getTracker().getLastX(pointer);\n const handlerY: number = handler.getTracker().getLastY(pointer);\n\n if (\n isPointerInBounds(handler.getView(), { x: handlerX, y: handlerY }) &&\n isPointerInBounds(otherHandler.getView(), { x: handlerX, y: handlerY })\n ) {\n overlap = true;\n }\n });\n\n otherPointers.forEach((pointer: number) => {\n const otherX: number = otherHandler.getTracker().getLastX(pointer);\n const otherY: number = otherHandler.getTracker().getLastY(pointer);\n\n if (\n isPointerInBounds(handler.getView(), { x: otherX, y: otherY }) &&\n isPointerInBounds(otherHandler.getView(), { x: otherX, y: otherY })\n ) {\n overlap = true;\n }\n });\n\n return overlap;\n }\n\n private isFinished(state: State): boolean {\n return (\n state === State.END || state === State.FAILED || state === State.CANCELLED\n );\n }\n\n // This function is called when handler receives touchdown event\n // If handler is using mouse or pen as a pointer and any handler receives touch event,\n // mouse/pen event dissappears - it doesn't send onPointerCancel nor onPointerUp (and others)\n // This became a problem because handler was left at active state without any signal to end or fail\n // To handle this, when new touch event is received, we loop through active handlers and check which type of\n // pointer they're using. If there are any handler with mouse/pen as a pointer, we cancel them\n public cancelMouseAndPenGestures(currentHandler: GestureHandler): void {\n this.gestureHandlers.forEach((handler: GestureHandler) => {\n if (\n handler.getPointerType() !== PointerType.MOUSE &&\n handler.getPointerType() !== PointerType.PEN\n ) {\n return;\n }\n\n if (handler !== currentHandler) {\n handler.cancel();\n } else {\n // Handler that received touch event should have its pointer tracker reset\n // This allows handler to smoothly change from mouse/pen to touch\n // The drawback is, that when we try to use mouse/pen one more time, it doesn't send onPointerDown at the first time\n // so it is required to click two times to get handler to work\n //\n // However, handler will receive manually created onPointerEnter that is triggered in EventManager in onPointerMove method.\n // There may be possibility to use that fact to make handler respond properly to first mouse click\n handler.getTracker().resetTracker();\n }\n });\n }\n\n public static getInstance(): GestureHandlerOrchestrator {\n if (!GestureHandlerOrchestrator.instance) {\n GestureHandlerOrchestrator.instance = new GestureHandlerOrchestrator();\n }\n\n return GestureHandlerOrchestrator.instance;\n }\n}\n"]}