43 lines
1.0 KiB
TypeScript
43 lines
1.0 KiB
TypeScript
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;
|
|
};
|
|
}
|