diff --git a/packages/excalidraw/components/App.tsx b/packages/excalidraw/components/App.tsx index af8c13d7b..92ac63297 100644 --- a/packages/excalidraw/components/App.tsx +++ b/packages/excalidraw/components/App.tsx @@ -118,6 +118,7 @@ import { DEFAULT_REDUCED_GLOBAL_ALPHA, isSafari, type EXPORT_IMAGE_TYPES, + DOUBLE_CLICK_POINTERUP_TIMEOUT, } from "../constants"; import { exportCanvas, loadFromBlob } from "../data"; import Library, { distributeLibraryItemsOnSquareGrid } from "../data/library"; @@ -5350,6 +5351,14 @@ class App extends React.Component { private handleCanvasDoubleClick = ( event: React.MouseEvent, ) => { + if ( + this.lastPointerDownEvent && + event.timeStamp - this.lastPointerDownEvent.timeStamp > + DOUBLE_CLICK_POINTERUP_TIMEOUT + ) { + return; + } + // case: double-clicking with arrow/line tool selected would both create // text and enter multiElement mode if (this.state.multiElement) { @@ -6345,6 +6354,7 @@ class App extends React.Component { } this.maybeCleanupAfterMissingPointerUp(event.nativeEvent); + this.maybeUnfollowRemoteUser(); if (this.state.searchMatches) { diff --git a/packages/excalidraw/constants.ts b/packages/excalidraw/constants.ts index 88cddd5c5..58006c42f 100644 --- a/packages/excalidraw/constants.ts +++ b/packages/excalidraw/constants.ts @@ -255,6 +255,14 @@ export const EXPORT_SOURCE = // time in milliseconds export const IMAGE_RENDER_TIMEOUT = 500; export const TAP_TWICE_TIMEOUT = 300; +/** + * The time the user has from 2nd pointerdown to following pointerup + * before it's not considered a double click. + * + * Helps prevent cases where you double-click by mistake but then drag/keep + * the pointer down for to cancel the double click or do another action. + */ +export const DOUBLE_CLICK_POINTERUP_TIMEOUT = 300; export const TOUCH_CTX_MENU_TIMEOUT = 500; export const TITLE_TIMEOUT = 10000; export const VERSION_TIMEOUT = 30000;