react-scope-event-emitter.ts 1023 B

12345678910111213141516171819202122232425262728293031
  1. import {
  2. ScopeEventEmitter,
  3. ScopeEventName,
  4. } from '../../../../../types/ide/scope-event-emitter'
  5. export class ReactScopeEventEmitter implements ScopeEventEmitter {
  6. // eslint-disable-next-line no-useless-constructor
  7. constructor(private readonly eventEmitter: EventTarget) {}
  8. emit(eventName: ScopeEventName, broadcast: boolean, ...detail: unknown[]) {
  9. this.eventEmitter.dispatchEvent(new CustomEvent(eventName, { detail }))
  10. }
  11. on(eventName: ScopeEventName, listener: (...args: unknown[]) => void) {
  12. // A listener attached via useScopeEventListener expects an event as the
  13. // first parameter. We don't have one, so just provide an empty object
  14. const wrappedListener = (event: CustomEvent<unknown[]>) => {
  15. listener({}, ...event.detail)
  16. }
  17. this.eventEmitter.addEventListener(
  18. eventName,
  19. wrappedListener as EventListener
  20. )
  21. return () => {
  22. this.eventEmitter.removeEventListener(
  23. eventName,
  24. wrappedListener as EventListener
  25. )
  26. }
  27. }
  28. }