Skip to content

Commit 774c45e

Browse files
authored
Merge pull request #39 from CodinGame/add-onsave-callback
Add onDidSave prop
2 parents 3cea62b + a221455 commit 774c45e

File tree

1 file changed

+18
-6
lines changed

1 file changed

+18
-6
lines changed

src/MonacoEditor.tsx

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import debounce from 'lodash.debounce'
33
import * as monaco from 'monaco-editor'
44
import { createEditor, getMonacoLanguage, updateEditorKeybindingsMode, registerEditorOpenHandler, createModelReference } from '@codingame/monaco-editor-wrapper'
55
import { IEditorOptions, IResolvedTextEditorModel } from '@codingame/monaco-vscode-editor-service-override'
6-
import { IReference, ITextFileEditorModel } from 'vscode/monaco'
6+
import { DisposableStore, IReference, ITextFileEditorModel } from 'vscode/monaco'
7+
import type { ITextFileEditorModelSaveEvent } from 'vscode/vscode/vs/workbench/services/textfile/common/textfiles'
78
import { useDeepMemo, useLastValueRef, useLastVersion, useThemeColor } from './hooks'
89
import './style'
910

@@ -53,6 +54,8 @@ export function defaultSaveViewState (editor: monaco.editor.IStandaloneCodeEdito
5354
viewStates.delete(key)
5455
}
5556
}
57+
function defaultOnDidSave () {
58+
}
5659

5760
export interface MonacoEditorProps {
5861
/**
@@ -75,6 +78,7 @@ export interface MonacoEditorProps {
7578
fileUri?: string
7679
options?: monaco.editor.IStandaloneEditorConstructionOptions
7780
onChange?: (value: string, event: monaco.editor.IModelContentChangedEvent) => void
81+
onDidSave?: (event: ITextFileEditorModelSaveEvent) => void
7882
markers?: monaco.editor.IMarkerData[]
7983
keyBindingsMode?: KeyBindingsMode
8084
/**
@@ -117,7 +121,8 @@ function MonacoEditor ({
117121
markers,
118122
saveViewState = defaultSaveViewState,
119123
restoreViewState = defaultRestoreViewState,
120-
onEditorOpenRequest
124+
onEditorOpenRequest,
125+
onDidSave = defaultOnDidSave
121126
}: MonacoEditorProps, ref: ForwardedRef<monaco.editor.IStandaloneCodeEditor>): ReactElement {
122127
const editorRef = useRef<monaco.editor.IStandaloneCodeEditor>()
123128
const modelRef = useRef<monaco.editor.ITextModel>()
@@ -145,6 +150,7 @@ function MonacoEditor ({
145150
const valueRef = useLastValueRef(fixedCode)
146151
const lastSaveViewState = useLastVersion(saveViewState)
147152
const lastRestoreViewState = useLastVersion(restoreViewState)
153+
const lastOnDidSave = useLastVersion(onDidSave)
148154

149155
const hasValue = fixedCode != null
150156

@@ -202,16 +208,22 @@ function MonacoEditor ({
202208
setModelReady(false)
203209

204210
const value = valueRef.current
205-
let modelIRefPromise: Promise<IReference<ITextFileEditorModel>> | undefined
206211
let modelIRef: IReference<ITextFileEditorModel> | undefined
207212
let model: monaco.editor.ITextModel
213+
const disposableStore = new DisposableStore()
208214
if (fileUri != null) {
209-
modelIRefPromise = createModelReference(monaco.Uri.parse(fileUri), value!)
215+
const modelIRefPromise = createModelReference(monaco.Uri.parse(fileUri), value!)
216+
disposableStore.add({
217+
dispose () {
218+
void modelIRefPromise.then(modelIRef => modelIRef.dispose(), console.error)
219+
}
220+
})
210221
modelIRef = (await modelIRefPromise)!
211222
if (cancelled) {
212223
modelIRef.dispose()
213224
return () => {}
214225
}
226+
disposableStore.add(modelIRef.object.onDidSave(lastOnDidSave))
215227
model = modelIRef.object.textEditorModel!
216228
if (monacoLanguage != null && model.getLanguageId() !== monacoLanguage) {
217229
monaco.editor.setModelLanguage(model, monacoLanguage)
@@ -230,7 +242,7 @@ function MonacoEditor ({
230242
if (editorRef.current != null) {
231243
lastSaveViewState(editorRef.current, model)
232244
}
233-
modelIRefPromise?.then(modelIRef => modelIRef.dispose(), console.error)
245+
disposableStore.dispose()
234246
modelRef.current = undefined
235247
}
236248
}
@@ -239,7 +251,7 @@ function MonacoEditor ({
239251
cancelled = true
240252
disposePromise.then(dispose => dispose(), console.error)
241253
}
242-
}, [monacoLanguage, fileUri, valueRef, lastSaveViewState, lastRestoreViewState, hasValue])
254+
}, [monacoLanguage, fileUri, valueRef, lastSaveViewState, lastRestoreViewState, hasValue, lastOnDidSave])
243255

244256
// Update value
245257
useEffect(() => {

0 commit comments

Comments
 (0)