import { Project } from '../../../../types/project' import { PermissionsLevel } from '@/features/ide-react/types/permissions' import { ShareJsDoc } from '@/features/ide-react/editor/share-js-doc' import { GotoLineOptions } from '@/features/ide-react/types/goto-line-options' import { CursorPosition } from '@/features/ide-react/types/cursor-position' import { FileTreeFindResult } from '@/features/ide-react/types/file-tree' export type IdeEvents = { 'project:joined': [{ project: Project; permissionsLevel: PermissionsLevel }] 'document:closed': [doc: ShareJsDoc] 'doc:changed': [{ doc_id: string }] 'doc:saved': [{ doc_id: string }] 'doc:opened': [] 'ide:opAcknowledged': [{ doc_id: string; op: any }] 'store-doc-position': [] 'editor:gotoOffset': [gotoOffset: number] 'editor:gotoLine': [options: GotoLineOptions] 'cursor:editor:update': [position: CursorPosition] 'outline-toggled': [isOpen: boolean] 'cursor:editor:syncToPdf': [] 'scroll:editor:update': [] 'comment:start_adding': [] 'history:toggle': [] 'entity:deleted': [entity: FileTreeFindResult] } export class IdeEventEmitter extends EventTarget { emit(eventName: T, ...detail: IdeEvents[T]) { this.dispatchEvent(new CustomEvent(eventName, { detail })) } on( eventName: T, listener: (event: CustomEvent) => void ) { this.addEventListener(eventName, listener as EventListener) } once( eventName: T, listener: (event: CustomEvent) => void ) { this.addEventListener(eventName, listener as EventListener, { once: true }) } off( eventName: T, listener: (event: CustomEvent) => void ) { this.removeEventListener(eventName, listener as EventListener) } } export function createIdeEventEmitter() { return new IdeEventEmitter() }