react-scope-event-emitter.ts 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import {
  2. ScopeEventEmitter,
  3. ScopeEventName,
  4. } from '../../../../../types/ide/scope-event-emitter'
  5. import { IdeEvents } from '@/features/ide-react/create-ide-event-emitter'
  6. export class ReactScopeEventEmitter implements ScopeEventEmitter {
  7. // eslint-disable-next-line no-useless-constructor
  8. constructor(private readonly eventEmitter: EventTarget) {}
  9. emit<T extends ScopeEventName>(
  10. eventName: T,
  11. broadcast: boolean,
  12. ...detail: IdeEvents[T]
  13. ) {
  14. this.eventEmitter.dispatchEvent(new CustomEvent(eventName, { detail }))
  15. }
  16. on<T extends ScopeEventName>(
  17. eventName: T,
  18. listener: (event: Event, ...args: IdeEvents[T]) => void
  19. ) {
  20. const wrappedListener = (event: CustomEvent<IdeEvents[T]>) => {
  21. listener(event, ...event.detail)
  22. }
  23. this.eventEmitter.addEventListener(
  24. eventName,
  25. wrappedListener as EventListener
  26. )
  27. return () => {
  28. this.eventEmitter.removeEventListener(
  29. eventName,
  30. wrappedListener as EventListener
  31. )
  32. }
  33. }
  34. }