Files
overleaf-cep/services/web/frontend/js/features/ide-react/create-ide-event-emitter.ts
T
Davinder Singh 36d0a5c227 Merge pull request #35855 from overleaf/ds-unable-to-sync-modal-improved
[WEB] Adding improved version of the unable to sync modal

GitOrigin-RevId: 1cfe2b3a2e8417028339efddb18385a5224e50c3
2026-09-17 11:43:20 +00:00

66 lines
2.2 KiB
TypeScript

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 { GotoOffsetOptions } from '@/features/ide-react/context/editor-manager-context'
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 }]
'ide:opAcknowledged': [{ doc_id: string; op: any }]
'store-doc-position': []
'editor:gotoOffset': [options: GotoOffsetOptions]
'editor:gotoLine': [options: GotoLineOptions]
'cursor:editor:update': [position: CursorPosition]
'outline-toggled': [isOpen: boolean]
'cursor:editor:syncToPdf': []
'scroll:editor:update': [middleVisibleLine?: number]
'comment:start_adding': []
'history:toggle': []
'entity:deleted': [entity: FileTreeFindResult]
'ide:unableToSyncOfflineChanges': [
{
docId: string
editorContent: string
baseContent: string
docName: string
},
]
'ide:offlineChangesSynced': [{ docId: string }]
}
export class IdeEventEmitter extends EventTarget {
emit<T extends keyof IdeEvents>(eventName: T, ...detail: IdeEvents[T]) {
this.dispatchEvent(new CustomEvent<IdeEvents[T]>(eventName, { detail }))
}
on<T extends keyof IdeEvents>(
eventName: T,
listener: (event: CustomEvent<IdeEvents[T]>) => void
) {
this.addEventListener(eventName, listener as EventListener)
}
once<T extends keyof IdeEvents>(
eventName: T,
listener: (event: CustomEvent<IdeEvents[T]>) => void
) {
this.addEventListener(eventName, listener as EventListener, { once: true })
}
off<T extends keyof IdeEvents>(
eventName: T,
listener: (event: CustomEvent<IdeEvents[T]>) => void
) {
this.removeEventListener(eventName, listener as EventListener)
}
}
export function createIdeEventEmitter() {
return new IdeEventEmitter()
}