|
@@ -119,6 +119,7 @@ function withBatchedUpdates<
|
|
|
|
|
|
const { history } = createHistory();
|
|
|
|
|
|
+let didTapTwice: boolean = false;
|
|
|
let cursorX = 0;
|
|
|
let cursorY = 0;
|
|
|
let isHoldingSpace: boolean = false;
|
|
@@ -368,6 +369,7 @@ export class App extends React.Component<any, AppState> {
|
|
|
document.addEventListener("copy", this.onCopy);
|
|
|
document.addEventListener("paste", this.pasteFromClipboard);
|
|
|
document.addEventListener("cut", this.onCut);
|
|
|
+ window.addEventListener("touchstart", this.onTapStart);
|
|
|
|
|
|
document.addEventListener("keydown", this.onKeyDown, false);
|
|
|
document.addEventListener("keyup", this.onKeyUp, { passive: true });
|
|
@@ -401,6 +403,7 @@ export class App extends React.Component<any, AppState> {
|
|
|
|
|
|
document.removeEventListener("copy", this.onCopy);
|
|
|
document.removeEventListener("paste", this.pasteFromClipboard);
|
|
|
+ window.removeEventListener("touchstart", this.onTapStart);
|
|
|
document.removeEventListener("cut", this.onCut);
|
|
|
|
|
|
document.removeEventListener("keydown", this.onKeyDown, false);
|
|
@@ -553,6 +556,27 @@ export class App extends React.Component<any, AppState> {
|
|
|
);
|
|
|
};
|
|
|
|
|
|
+ private onTapStart = (event: TouchEvent) => {
|
|
|
+ let timeoutId;
|
|
|
+ if (!didTapTwice) {
|
|
|
+ didTapTwice = true;
|
|
|
+ timeoutId = setTimeout(function () {
|
|
|
+ didTapTwice = false;
|
|
|
+ }, 300);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (didTapTwice) {
|
|
|
+ const [touch] = event.touches;
|
|
|
+ // @ts-ignore
|
|
|
+ this.handleCanvasDoubleClick({
|
|
|
+ clientX: touch.clientX,
|
|
|
+ clientY: touch.clientY,
|
|
|
+ });
|
|
|
+ clearTimeout(timeoutId);
|
|
|
+ }
|
|
|
+ event.preventDefault();
|
|
|
+ };
|
|
|
+
|
|
|
private pasteFromClipboard = withBatchedUpdates(
|
|
|
async (event: ClipboardEvent | null) => {
|
|
|
// #686
|