6
6
import './media/chatEditorController.css' ;
7
7
import { addStandardDisposableListener , getTotalWidth } from '../../../../base/browser/dom.js' ;
8
8
import { Disposable , DisposableStore , dispose , toDisposable } from '../../../../base/common/lifecycle.js' ;
9
- import { autorun , autorunWithStore , derived , IObservable , observableFromEvent , observableValue } from '../../../../base/common/observable.js' ;
9
+ import { autorun , autorunWithStore , derived , IObservable , observableFromEvent , observableFromEventOpts , observableValue } from '../../../../base/common/observable.js' ;
10
10
import { themeColorFromId } from '../../../../base/common/themables.js' ;
11
11
import { ICodeEditor , IOverlayWidget , IOverlayWidgetPosition , IOverlayWidgetPositionCoordinates , IViewZone , MouseTargetType } from '../../../../editor/browser/editorBrowser.js' ;
12
12
import { LineSource , renderLines , RenderOptions } from '../../../../editor/browser/widget/diffEditor/components/diffEditorViewZones/renderLines.js' ;
@@ -127,8 +127,24 @@ export class ChatEditorController extends Disposable implements IEditorContribut
127
127
return undefined ;
128
128
} ) ;
129
129
130
+ const lastRequest = derived ( r => {
131
+ const entry = entryForEditor . read ( r ) ;
132
+ if ( ! entry ) {
133
+ return undefined ;
134
+ }
135
+ return observableFromEventOpts (
136
+ { equalsFn : ( a , b ) => a ?. id === b ?. id } ,
137
+ entry . chatModel . onDidChange , ( ) => entry . chatModel . getRequests ( ) . at ( - 1 )
138
+ ) . read ( r ) ;
139
+ } ) ;
130
140
131
141
let scrollState : StableEditorScrollState | undefined = undefined ;
142
+ let didReveal = false ;
143
+ this . _register ( autorun ( r => {
144
+ const value = lastRequest . read ( r ) ;
145
+ scrollState = value ? StableEditorScrollState . capture ( _editor ) : undefined ;
146
+ didReveal = false ;
147
+ } ) ) ;
132
148
133
149
this . _register ( autorunWithStore ( ( r , store ) => {
134
150
@@ -137,7 +153,6 @@ export class ChatEditorController extends Disposable implements IEditorContribut
137
153
if ( ! currentEditorEntry ) {
138
154
this . _ctxIsGlobalEditsSession . reset ( ) ;
139
155
this . _clear ( ) ;
140
- scrollState = undefined ;
141
156
return ;
142
157
}
143
158
@@ -146,13 +161,7 @@ export class ChatEditorController extends Disposable implements IEditorContribut
146
161
return ;
147
162
}
148
163
149
- const { session, chatModel, entries, idx, entry } = currentEditorEntry ;
150
-
151
- const lastRequestSignal = observableFromEvent ( this , chatModel . onDidChange , ( ) => chatModel . getRequests ( ) . at ( - 1 ) ) ;
152
- store . add ( autorun ( r => {
153
- lastRequestSignal . read ( r ) ;
154
- scrollState ??= StableEditorScrollState . capture ( this . _editor ) ;
155
- } ) ) ;
164
+ const { session, entries, idx, entry } = currentEditorEntry ;
156
165
157
166
this . _ctxIsGlobalEditsSession . set ( session . isGlobalEditingSession ) ;
158
167
this . _ctxReviewModelEnabled . set ( entry . reviewMode . read ( r ) ) ;
@@ -206,12 +215,13 @@ export class ChatEditorController extends Disposable implements IEditorContribut
206
215
this . _clearDiffRendering ( ) ;
207
216
}
208
217
209
- if ( lastRequestSignal . read ( r ) ?. response ?. isComplete ) {
210
- if ( ! diff . identical ) {
211
- this . _reveal ( true , false , ScrollType . Immediate ) ;
212
- } else {
218
+ if ( lastRequest . read ( r ) ?. response ?. isComplete ) {
219
+ if ( diff . identical ) {
213
220
scrollState ?. restore ( _editor ) ;
214
221
scrollState = undefined ;
222
+ } else if ( ! didReveal ) {
223
+ this . _reveal ( true , false , ScrollType . Immediate ) ;
224
+ didReveal = true ;
215
225
}
216
226
}
217
227
}
0 commit comments