|
@@ -186,7 +186,7 @@ let isPanning: boolean = false;
|
|
|
let isDraggingScrollBar: boolean = false;
|
|
|
let currentScrollBars: ScrollBars = { horizontal: null, vertical: null };
|
|
|
let touchTimeout = 0;
|
|
|
-let touchMoving = false;
|
|
|
+let invalidateContextMenu = false;
|
|
|
|
|
|
let lastPointerUp: ((event: any) => void) | null = null;
|
|
|
const gesture: Gesture = {
|
|
@@ -645,6 +645,7 @@ class App extends React.Component<ExcalidrawProps, AppState> {
|
|
|
this.removeEventListeners();
|
|
|
this.scene.destroy();
|
|
|
clearTimeout(touchTimeout);
|
|
|
+ touchTimeout = 0;
|
|
|
}
|
|
|
|
|
|
private onResize = withBatchedUpdates(() => {
|
|
@@ -1097,7 +1098,8 @@ class App extends React.Component<ExcalidrawProps, AppState> {
|
|
|
// remove touch handler for context menu on touch devices
|
|
|
if (event.pointerType === "touch" && touchTimeout) {
|
|
|
clearTimeout(touchTimeout);
|
|
|
- touchMoving = false;
|
|
|
+ touchTimeout = 0;
|
|
|
+ invalidateContextMenu = false;
|
|
|
}
|
|
|
|
|
|
gesture.pointers.delete(event.pointerId);
|
|
@@ -1924,7 +1926,7 @@ class App extends React.Component<ExcalidrawProps, AppState> {
|
|
|
|
|
|
// set touch moving for mobile context menu
|
|
|
private handleTouchMove = (event: React.TouchEvent<HTMLCanvasElement>) => {
|
|
|
- touchMoving = true;
|
|
|
+ invalidateContextMenu = true;
|
|
|
};
|
|
|
|
|
|
private handleCanvasPointerDown = (
|
|
@@ -2029,18 +2031,26 @@ class App extends React.Component<ExcalidrawProps, AppState> {
|
|
|
): void => {
|
|
|
// deal with opening context menu on touch devices
|
|
|
if (event.pointerType === "touch") {
|
|
|
- touchMoving = false;
|
|
|
-
|
|
|
- // open the context menu with the first touch's clientX and clientY
|
|
|
- // if the touch is not moving
|
|
|
- touchTimeout = window.setTimeout(() => {
|
|
|
- if (!touchMoving) {
|
|
|
- this.openContextMenu({
|
|
|
- clientX: event.clientX,
|
|
|
- clientY: event.clientY,
|
|
|
- });
|
|
|
- }
|
|
|
- }, TOUCH_CTX_MENU_TIMEOUT);
|
|
|
+ invalidateContextMenu = false;
|
|
|
+
|
|
|
+ if (touchTimeout) {
|
|
|
+ // If there's already a touchTimeout, this means that there's another
|
|
|
+ // touch down and we are doing another touch, so we shouldn't open the
|
|
|
+ // context menu.
|
|
|
+ invalidateContextMenu = true;
|
|
|
+ } else {
|
|
|
+ // open the context menu with the first touch's clientX and clientY
|
|
|
+ // if the touch is not moving
|
|
|
+ touchTimeout = window.setTimeout(() => {
|
|
|
+ touchTimeout = 0;
|
|
|
+ if (!invalidateContextMenu) {
|
|
|
+ this.openContextMenu({
|
|
|
+ clientX: event.clientX,
|
|
|
+ clientY: event.clientY,
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, TOUCH_CTX_MENU_TIMEOUT);
|
|
|
+ }
|
|
|
}
|
|
|
};
|
|
|
|