main
js 82 lines 2.01 KB
Raw
1 /**
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 *
7 * @emails react-core
8 */
9
10 'use strict';
11
12 /**
13 * Touch events state machine.
14 *
15 * Keeps track of the active pointers and allows them to be reflected in touch events.
16 */
17
18 const activeTouches = new Map();
19
20 export function addTouch(touch) {
21 const identifier = touch.identifier;
22 const target = touch.target;
23 if (!activeTouches.has(target)) {
24 activeTouches.set(target, new Map());
25 }
26 if (activeTouches.get(target).get(identifier)) {
27 // Do not allow existing touches to be overwritten
28 console.error(
29 'Touch with identifier %s already exists. Did not record touch start.',
30 identifier,
31 );
32 } else {
33 activeTouches.get(target).set(identifier, touch);
34 }
35 }
36
37 export function updateTouch(touch) {
38 const identifier = touch.identifier;
39 const target = touch.target;
40 if (activeTouches.get(target) != null) {
41 activeTouches.get(target).set(identifier, touch);
42 } else {
43 console.error(
44 'Touch with identifier %s does not exist. Cannot record touch move without a touch start.',
45 identifier,
46 );
47 }
48 }
49
50 export function removeTouch(touch) {
51 const identifier = touch.identifier;
52 const target = touch.target;
53 if (activeTouches.get(target) != null) {
54 if (activeTouches.get(target).has(identifier)) {
55 activeTouches.get(target).delete(identifier);
56 } else {
57 console.error(
58 'Touch with identifier %s does not exist. Cannot record touch end without a touch start.',
59 identifier,
60 );
61 }
62 }
63 }
64
65 export function getTouches() {
66 const touches = [];
67 activeTouches.forEach((_, target) => {
68 touches.push(...getTargetTouches(target));
69 });
70 return touches;
71 }
72
73 export function getTargetTouches(target) {
74 if (activeTouches.get(target) != null) {
75 return Array.from(activeTouches.get(target).values());
76 }
77 return [];
78 }
79
80 export function clear() {
81 activeTouches.clear();
82 }