create-ide-event-emitter.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { Project } from '../../../../types/project'
  2. import { PermissionsLevel } from '@/features/ide-react/types/permissions'
  3. import { ShareJsDoc } from '@/features/ide-react/editor/share-js-doc'
  4. import { GotoLineOptions } from '@/features/ide-react/types/goto-line-options'
  5. import { GotoOffsetOptions } from '@/features/ide-react/context/editor-manager-context'
  6. import { CursorPosition } from '@/features/ide-react/types/cursor-position'
  7. import { FileTreeFindResult } from '@/features/ide-react/types/file-tree'
  8. export type IdeEvents = {
  9. 'project:joined': [{ project: Project; permissionsLevel: PermissionsLevel }]
  10. 'document:closed': [doc: ShareJsDoc]
  11. 'doc:changed': [{ doc_id: string }]
  12. 'doc:saved': [{ doc_id: string }]
  13. 'ide:opAcknowledged': [{ doc_id: string; op: any }]
  14. 'store-doc-position': []
  15. 'editor:gotoOffset': [options: GotoOffsetOptions]
  16. 'editor:gotoLine': [options: GotoLineOptions]
  17. 'cursor:editor:update': [position: CursorPosition]
  18. 'outline-toggled': [isOpen: boolean]
  19. 'cursor:editor:syncToPdf': []
  20. 'scroll:editor:update': [middleVisibleLine?: number]
  21. 'comment:start_adding': []
  22. 'history:toggle': []
  23. 'entity:deleted': [entity: FileTreeFindResult]
  24. }
  25. export class IdeEventEmitter extends EventTarget {
  26. emit<T extends keyof IdeEvents>(eventName: T, ...detail: IdeEvents[T]) {
  27. this.dispatchEvent(new CustomEvent<IdeEvents[T]>(eventName, { detail }))
  28. }
  29. on<T extends keyof IdeEvents>(
  30. eventName: T,
  31. listener: (event: CustomEvent<IdeEvents[T]>) => void
  32. ) {
  33. this.addEventListener(eventName, listener as EventListener)
  34. }
  35. once<T extends keyof IdeEvents>(
  36. eventName: T,
  37. listener: (event: CustomEvent<IdeEvents[T]>) => void
  38. ) {
  39. this.addEventListener(eventName, listener as EventListener, { once: true })
  40. }
  41. off<T extends keyof IdeEvents>(
  42. eventName: T,
  43. listener: (event: CustomEvent<IdeEvents[T]>) => void
  44. ) {
  45. this.removeEventListener(eventName, listener as EventListener)
  46. }
  47. }
  48. export function createIdeEventEmitter() {
  49. return new IdeEventEmitter()
  50. }