Skip to content

Commit f320df1

Browse files
committed
fix view unregister and update
1 parent 2982f41 commit f320df1

File tree

1 file changed

+61
-16
lines changed

1 file changed

+61
-16
lines changed

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

Lines changed: 61 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ class LocalChatSessionsProvider extends Disposable implements IChatSessionItemPr
254254
// Chat sessions container
255255
class ChatSessionsViewPaneContainer extends ViewPaneContainer {
256256
private localProvider: LocalChatSessionsProvider | undefined;
257+
private registeredViewDescriptors: Map<string, IViewDescriptor> = new Map();
257258

258259
constructor(
259260
@IInstantiationService instantiationService: IInstantiationService,
@@ -307,34 +308,78 @@ class ChatSessionsViewPaneContainer extends ViewPaneContainer {
307308
}
308309

309310
private updateViewRegistration(): void {
310-
this.registerViews();
311+
const currentProviders = this.chatSessionsService.providers;
312+
const currentProviderIds = new Set(currentProviders.map(p => p.chatSessionType));
313+
314+
// Find views that need to be unregistered (providers that are no longer available)
315+
const viewsToUnregister: IViewDescriptor[] = [];
316+
for (const [providerId, viewDescriptor] of this.registeredViewDescriptors.entries()) {
317+
if (!currentProviderIds.has(providerId)) {
318+
viewsToUnregister.push(viewDescriptor);
319+
this.registeredViewDescriptors.delete(providerId);
320+
}
321+
}
311322

312-
// TODO handle unregistering views
323+
// Unregister removed views
324+
if (viewsToUnregister.length > 0) {
325+
const container = Registry.as<IViewContainersRegistry>(Extensions.ViewContainersRegistry).get(VIEWLET_ID);
326+
if (container) {
327+
Registry.as<IViewsRegistry>(Extensions.ViewsRegistry).deregisterViews(viewsToUnregister, container);
328+
}
329+
}
330+
331+
// Register new views
332+
this.registerViews();
313333
}
314334

315335
private async registerViews() {
316336
const container = Registry.as<IViewContainersRegistry>(Extensions.ViewContainersRegistry).get(VIEWLET_ID);
317337
const providers = this.chatSessionsService.providers;
318-
const viewDescriptors: IViewDescriptor[] = [];
338+
319339
if (container && providers.length > 0) {
340+
const viewDescriptorsToRegister: IViewDescriptor[] = [];
320341
let index = 1;
342+
321343
providers.forEach(provider => {
322-
viewDescriptors.push({
323-
id: `${VIEWLET_ID}.${provider.chatSessionType}`,
324-
// TODO: localization?
325-
name: {
326-
value: provider.label,
327-
original: provider.label,
328-
},
329-
ctorDescriptor: new SyncDescriptor(SessionsViewPane, [provider]),
330-
canToggleVisibility: true,
331-
canMoveView: true,
332-
order: provider.chatSessionType === 'local' ? 0 : index++,
333-
});
344+
// Only register if not already registered
345+
if (!this.registeredViewDescriptors.has(provider.chatSessionType)) {
346+
const viewDescriptor: IViewDescriptor = {
347+
id: `${VIEWLET_ID}.${provider.chatSessionType}`,
348+
// TODO: localization?
349+
name: {
350+
value: provider.label,
351+
original: provider.label,
352+
},
353+
ctorDescriptor: new SyncDescriptor(SessionsViewPane, [provider]),
354+
canToggleVisibility: true,
355+
canMoveView: true,
356+
order: provider.chatSessionType === 'local' ? 0 : index++,
357+
};
358+
359+
viewDescriptorsToRegister.push(viewDescriptor);
360+
this.registeredViewDescriptors.set(provider.chatSessionType, viewDescriptor);
361+
}
334362
});
335-
Registry.as<IViewsRegistry>(Extensions.ViewsRegistry).registerViews(viewDescriptors, container);
363+
364+
if (viewDescriptorsToRegister.length > 0) {
365+
Registry.as<IViewsRegistry>(Extensions.ViewsRegistry).registerViews(viewDescriptorsToRegister, container);
366+
}
336367
}
337368
}
369+
370+
override dispose(): void {
371+
// Unregister all views before disposal
372+
if (this.registeredViewDescriptors.size > 0) {
373+
const container = Registry.as<IViewContainersRegistry>(Extensions.ViewContainersRegistry).get(VIEWLET_ID);
374+
if (container) {
375+
const allRegisteredViews = Array.from(this.registeredViewDescriptors.values());
376+
Registry.as<IViewsRegistry>(Extensions.ViewsRegistry).deregisterViews(allRegisteredViews, container);
377+
}
378+
this.registeredViewDescriptors.clear();
379+
}
380+
381+
super.dispose();
382+
}
338383
}
339384

340385
// Chat sessions item data source for the tree

0 commit comments

Comments
 (0)