@@ -3,7 +3,8 @@ import debounce from 'lodash.debounce'
33import * as monaco from 'monaco-editor'
44import { createEditor , getMonacoLanguage , updateEditorKeybindingsMode , registerEditorOpenHandler , createModelReference } from '@codingame/monaco-editor-wrapper'
55import { 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'
78import { useDeepMemo , useLastValueRef , useLastVersion , useThemeColor } from './hooks'
89import './style'
910
@@ -53,6 +54,8 @@ export function defaultSaveViewState (editor: monaco.editor.IStandaloneCodeEdito
5354 viewStates . delete ( key )
5455 }
5556}
57+ function defaultOnDidSave ( ) {
58+ }
5659
5760export 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