feat: add timeout on doublick pointerup

This commit is contained in:
dwelle 2025-01-07 17:57:27 +01:00
parent 2ac55067cd
commit 36b387f973
3 changed files with 24 additions and 4 deletions

View File

@ -91,6 +91,7 @@ import {
DEFAULT_REDUCED_GLOBAL_ALPHA, DEFAULT_REDUCED_GLOBAL_ALPHA,
isSafari, isSafari,
type EXPORT_IMAGE_TYPES, type EXPORT_IMAGE_TYPES,
DOUBLE_CLICK_POINTERUP_TIMEOUT,
} from "../constants"; } from "../constants";
import type { ExportedElements } from "../data"; import type { ExportedElements } from "../data";
import { exportCanvas, loadFromBlob } from "../data"; import { exportCanvas, loadFromBlob } from "../data";
@ -5349,6 +5350,14 @@ class App extends React.Component<AppProps, AppState> {
private handleCanvasDoubleClick = ( private handleCanvasDoubleClick = (
event: React.MouseEvent<HTMLCanvasElement>, event: React.MouseEvent<HTMLCanvasElement>,
) => { ) => {
if (
this.lastPointerDownEvent &&
event.timeStamp - this.lastPointerDownEvent.timeStamp >
DOUBLE_CLICK_POINTERUP_TIMEOUT
) {
return;
}
// case: double-clicking with arrow/line tool selected would both create // case: double-clicking with arrow/line tool selected would both create
// text and enter multiElement mode // text and enter multiElement mode
if (this.state.multiElement) { if (this.state.multiElement) {
@ -6279,6 +6288,9 @@ class App extends React.Component<AppProps, AppState> {
event: React.PointerEvent<HTMLElement>, event: React.PointerEvent<HTMLElement>,
) => { ) => {
this.maybeCleanupAfterMissingPointerUp(event.nativeEvent); this.maybeCleanupAfterMissingPointerUp(event.nativeEvent);
this.lastPointerDownEvent = event;
this.maybeUnfollowRemoteUser(); this.maybeUnfollowRemoteUser();
if (this.state.searchMatches) { if (this.state.searchMatches) {
@ -6378,8 +6390,6 @@ class App extends React.Component<AppProps, AppState> {
return; return;
} }
this.lastPointerDownEvent = event;
// we must exit before we set `cursorButton` state and `savePointer` // we must exit before we set `cursorButton` state and `savePointer`
// else it will send pointer state & laser pointer events in collab when // else it will send pointer state & laser pointer events in collab when
// panning // panning

View File

@ -255,6 +255,14 @@ export const EXPORT_SOURCE =
// time in milliseconds // time in milliseconds
export const IMAGE_RENDER_TIMEOUT = 500; export const IMAGE_RENDER_TIMEOUT = 500;
export const TAP_TWICE_TIMEOUT = 300; 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 TOUCH_CTX_MENU_TIMEOUT = 500;
export const TITLE_TIMEOUT = 10000; export const TITLE_TIMEOUT = 10000;
export const VERSION_TIMEOUT = 30000; export const VERSION_TIMEOUT = 30000;

View File

@ -940,12 +940,13 @@ History {
"startBinding": null, "startBinding": null,
"width": 100, "width": 100,
"x": 150, "x": 150,
"y": 0,
}, },
"inserted": { "inserted": {
"endBinding": { "endBinding": {
"elementId": "id160", "elementId": "id160",
"fixedPoint": null, "fixedPoint": null,
"focus": 0, "focus": "-0.00000",
"gap": 1, "gap": 1,
}, },
"points": [ "points": [
@ -961,11 +962,12 @@ History {
"startBinding": { "startBinding": {
"elementId": "id159", "elementId": "id159",
"fixedPoint": null, "fixedPoint": null,
"focus": 0, "focus": "0.00000",
"gap": 1, "gap": 1,
}, },
"width": 0, "width": 0,
"x": 149, "x": 149,
"y": "0.00000",
}, },
}, },
}, },