mirror of
https://github.com/t8y2/dbx.git
synced 2026-10-31 00:22:30 +00:00
fix: prevent repeated menu activations
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
export const DEFAULT_REPEATED_ACTIVATION_WINDOW_MS = 500;
|
||||
|
||||
export interface ActionActivationGuard {
|
||||
lastActivatedAt?: number;
|
||||
running?: boolean;
|
||||
}
|
||||
|
||||
function nowMs(): number {
|
||||
if (typeof performance !== "undefined" && typeof performance.now === "function") {
|
||||
return performance.now();
|
||||
}
|
||||
return Date.now();
|
||||
}
|
||||
|
||||
export function shouldSuppressRepeatedActivation(
|
||||
guard: ActionActivationGuard,
|
||||
now = nowMs(),
|
||||
windowMs = DEFAULT_REPEATED_ACTIVATION_WINDOW_MS,
|
||||
): boolean {
|
||||
if (guard.lastActivatedAt !== undefined && now - guard.lastActivatedAt < windowMs) {
|
||||
return true;
|
||||
}
|
||||
guard.lastActivatedAt = now;
|
||||
return false;
|
||||
}
|
||||
|
||||
export function suppressEvent(event: Event) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
event.stopImmediatePropagation?.();
|
||||
}
|
||||
|
||||
export function tryStartExclusiveActivation(guard: ActionActivationGuard): (() => void) | null {
|
||||
if (guard.running) return null;
|
||||
guard.running = true;
|
||||
let finished = false;
|
||||
return () => {
|
||||
if (finished) return;
|
||||
finished = true;
|
||||
guard.running = false;
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user