fix(lifecycle-component): support 'once' option for event listeners
This commit is contained in:
		| @@ -1,5 +1,5 @@ | ||||
| { | ||||
|   "expiryDate": "2025-08-27T14:28:53.471Z", | ||||
|   "issueDate": "2025-05-29T14:28:53.471Z", | ||||
|   "savedAt": "2025-05-29T14:28:53.473Z" | ||||
|   "expiryDate": "2025-08-29T18:29:48.329Z", | ||||
|   "issueDate": "2025-05-31T18:29:48.329Z", | ||||
|   "savedAt": "2025-05-31T18:29:48.330Z" | ||||
| } | ||||
| @@ -55,8 +55,8 @@ class TestComponent extends LifecycleComponent { | ||||
|     return this.clearInterval(timer); | ||||
|   } | ||||
|  | ||||
|   public testAddEventListener(target: any, event: string, handler: Function): void { | ||||
|     return this.addEventListener(target, event, handler); | ||||
|   public testAddEventListener(target: any, event: string, handler: Function, options?: { once?: boolean }): void { | ||||
|     return this.addEventListener(target, event, handler, options); | ||||
|   } | ||||
|  | ||||
|   public testIsShuttingDown(): boolean { | ||||
|   | ||||
| @@ -91,19 +91,37 @@ export abstract class LifecycleComponent { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     // For 'once' listeners, we need to wrap the handler to remove it from our tracking | ||||
|     let actualHandler = handler; | ||||
|     if (options?.once) { | ||||
|       actualHandler = (...args: any[]) => { | ||||
|         // Call the original handler | ||||
|         handler(...args); | ||||
|          | ||||
|         // Remove from our internal tracking | ||||
|         const index = this.listeners.findIndex( | ||||
|           l => l.target === target && l.event === event && l.handler === handler | ||||
|         ); | ||||
|         if (index !== -1) { | ||||
|           this.listeners.splice(index, 1); | ||||
|         } | ||||
|       }; | ||||
|     } | ||||
|  | ||||
|     // Support both EventEmitter and DOM-style event targets | ||||
|     if (typeof target.on === 'function') { | ||||
|       if (options?.once) { | ||||
|         target.once(event, handler); | ||||
|         target.once(event, actualHandler); | ||||
|       } else { | ||||
|         target.on(event, handler); | ||||
|         target.on(event, actualHandler); | ||||
|       } | ||||
|     } else if (typeof target.addEventListener === 'function') { | ||||
|       target.addEventListener(event, handler, options); | ||||
|       target.addEventListener(event, actualHandler, options); | ||||
|     } else { | ||||
|       throw new Error('Target must support on() or addEventListener()'); | ||||
|     } | ||||
|  | ||||
|     // Store the original handler in our tracking (not the wrapped one) | ||||
|     this.listeners.push({  | ||||
|       target,  | ||||
|       event,  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user