Skip to content

Commit 09cef23

Browse files
authored
make sure to reveal/restore only once per chat request (microsoft#239307)
microsoft#239301
1 parent bc75335 commit 09cef23

File tree

1 file changed

+23
-13
lines changed

1 file changed

+23
-13
lines changed

src/vs/workbench/contrib/chat/browser/chatEditorController.ts

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import './media/chatEditorController.css';
77
import { addStandardDisposableListener, getTotalWidth } from '../../../../base/browser/dom.js';
88
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';
1010
import { themeColorFromId } from '../../../../base/common/themables.js';
1111
import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition, IOverlayWidgetPositionCoordinates, IViewZone, MouseTargetType } from '../../../../editor/browser/editorBrowser.js';
1212
import { LineSource, renderLines, RenderOptions } from '../../../../editor/browser/widget/diffEditor/components/diffEditorViewZones/renderLines.js';
@@ -127,8 +127,24 @@ export class ChatEditorController extends Disposable implements IEditorContribut
127127
return undefined;
128128
});
129129

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+
});
130140

131141
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+
}));
132148

133149
this._register(autorunWithStore((r, store) => {
134150

@@ -137,7 +153,6 @@ export class ChatEditorController extends Disposable implements IEditorContribut
137153
if (!currentEditorEntry) {
138154
this._ctxIsGlobalEditsSession.reset();
139155
this._clear();
140-
scrollState = undefined;
141156
return;
142157
}
143158

@@ -146,13 +161,7 @@ export class ChatEditorController extends Disposable implements IEditorContribut
146161
return;
147162
}
148163

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;
156165

157166
this._ctxIsGlobalEditsSession.set(session.isGlobalEditingSession);
158167
this._ctxReviewModelEnabled.set(entry.reviewMode.read(r));
@@ -206,12 +215,13 @@ export class ChatEditorController extends Disposable implements IEditorContribut
206215
this._clearDiffRendering();
207216
}
208217

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) {
213220
scrollState?.restore(_editor);
214221
scrollState = undefined;
222+
} else if (!didReveal) {
223+
this._reveal(true, false, ScrollType.Immediate);
224+
didReveal = true;
215225
}
216226
}
217227
}

0 commit comments

Comments
 (0)