Files
dbx/apps/desktop/src/lib/actionActivation.ts
T

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;
};
}