All files / src/dom events.ts

100% Statements 7/7
100% Branches 0/0
100% Functions 5/5
100% Lines 5/5

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27                          54x   54x   306x 306x       304x        
/** Tracks DOM event listeners so custom renderers can participate in cleanup. */
export interface EventRegistry {
  /** Register an event listener that will be removed when the form re-renders or is destroyed. */
  listen<K extends keyof HTMLElementEventMap>(
    element: HTMLElement | Document,
    type: K,
    listener: (event: HTMLElementEventMap[K]) => void
  ): void;
  /** Remove all listeners registered through this registry. */
  cleanup(): void;
}
 
export function createEventRegistry(): EventRegistry {
  const cleanupCallbacks: Array<() => void> = [];
 
  return {
    listen(element, type, listener) {
      element.addEventListener(type, listener as EventListener);
      cleanupCallbacks.push(() => element.removeEventListener(type, listener as EventListener));
    },
 
    cleanup() {
      cleanupCallbacks.splice(0).forEach((callback) => callback());
    }
  };
}