fix: prevent repeated menu activations

This commit is contained in:
t8y2
2026-05-16 19:52:31 +08:00
parent 1d77bac694
commit 320db12209
9 changed files with 193 additions and 36 deletions
+42
View File
@@ -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;
};
}