@@ -254,6 +254,7 @@ class LocalChatSessionsProvider extends Disposable implements IChatSessionItemPr
254254// Chat sessions container
255255class 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