@tanstack/hotkeys
Version:
Type-safe, framework-agnostic keyboard hotkey management for the browser
73 lines (72 loc) • 2.32 kB
JavaScript
//#region src/_target-listeners.ts
/** Shares keyboard listeners within each target and capture phase. */
var TargetListeners = class {
dispatch;
constructor(dispatch) {
this.dispatch = dispatch;
}
add(target, capture, id) {
if (typeof document === "undefined") return;
let phases = this.
if (!phases) {
phases = /* @__PURE__ */ new Map();
this.
}
let group = phases.get(capture);
if (!group) {
const ids = /* @__PURE__ */ new Set();
const listener = (eventType) => (rawEvent) => {
const event = rawEvent;
let processed = this.
const first = !processed || processed.groups.has(ids);
if (!processed || first) {
processed = {
ids: /* @__PURE__ */ new Set(),
groups: /* @__PURE__ */ new Set()
};
this.
}
processed.groups.add(ids);
const pending = /* @__PURE__ */ new Set();
for (const registrationId of ids) if (!processed.ids.has(registrationId)) {
processed.ids.add(registrationId);
pending.add(registrationId);
}
this.dispatch(event, target, eventType, capture, pending, first);
};
group = {
ids,
keydown: listener("keydown"),
keyup: listener("keyup")
};
phases.set(capture, group);
target.addEventListener("keydown", group.keydown, capture);
target.addEventListener("keyup", group.keyup, capture);
}
group.ids.add(id);
}
remove(target, capture, id) {
const phases = this.
const group = phases?.get(capture);
if (!group) return;
group.ids.delete(id);
if (group.ids.size === 0) {
target.removeEventListener("keydown", group.keydown, capture);
target.removeEventListener("keyup", group.keyup, capture);
phases.delete(capture);
if (phases.size === 0) this.
}
}
destroy() {
for (const [target, phases] of this.
target.removeEventListener("keydown", group.keydown, capture);
target.removeEventListener("keyup", group.keyup, capture);
}
this.
this.
}
};
//#endregion
export { TargetListeners };