@@ -7,7 +7,7 @@ import { localize } from 'vs/nls';
77import { dispose , Disposable } from 'vs/base/common/lifecycle' ;
88import { assign } from 'vs/base/common/objects' ;
99import { Event , Emitter } from 'vs/base/common/event' ;
10- import { isPromiseCanceledError } from 'vs/base/common/errors' ;
10+ import { isPromiseCanceledError , getErrorMessage } from 'vs/base/common/errors' ;
1111import { PagedModel , IPagedModel , IPager , DelayedPagedModel } from 'vs/base/common/paging' ;
1212import { SortBy , SortOrder , IQueryOptions , IExtensionTipsService , IExtensionRecommendation , IExtensionManagementServer , IExtensionManagementServerService } from 'vs/platform/extensionManagement/common/extensionManagement' ;
1313import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil' ;
@@ -69,9 +69,13 @@ export interface ExtensionsListViewOptions extends IViewletViewOptions {
6969 server ?: IExtensionManagementServer ;
7070}
7171
72+ class ExtensionListViewWarning extends Error { }
73+
7274export class ExtensionsListView extends ViewletPanel {
7375
7476 private readonly server : IExtensionManagementServer | undefined ;
77+ private messageContainer : HTMLElement ;
78+ private messageStatus : HTMLElement ;
7579 private messageBox : HTMLElement ;
7680 private extensionsList : HTMLElement ;
7781 private badge : CountBadge ;
@@ -117,7 +121,9 @@ export class ExtensionsListView extends ViewletPanel {
117121
118122 renderBody ( container : HTMLElement ) : void {
119123 this . extensionsList = append ( container , $ ( '.extensions-list' ) ) ;
120- this . messageBox = append ( container , $ ( '.message' ) ) ;
124+ this . messageContainer = append ( container , $ ( '.message-container' ) ) ;
125+ this . messageStatus = append ( this . messageContainer , $ ( '' ) ) ;
126+ this . messageBox = append ( this . messageContainer , $ ( '.message' ) ) ;
121127 const delegate = new Delegate ( ) ;
122128 const extensionsViewState = new ExtensionsViewState ( ) ;
123129 const renderer = this . instantiationService . createInstance ( Renderer , extensionsViewState ) ;
@@ -178,12 +184,11 @@ export class ExtensionsListView extends ViewletPanel {
178184 } ;
179185
180186
181- const errorCallback = ( e : Error ) => {
187+ const errorCallback = ( e : any ) => {
182188 const model = new PagedModel ( [ ] ) ;
183189 if ( ! isPromiseCanceledError ( e ) ) {
184190 this . queryRequest = null ;
185- console . warn ( 'Error querying extensions gallery' , e ) ;
186- this . setModel ( model , true ) ;
191+ this . setModel ( model , e ) ;
187192 }
188193 return this . list ? this . list . model : model ;
189194 } ;
@@ -238,7 +243,11 @@ export class ExtensionsListView extends ViewletPanel {
238243 if ( ExtensionsListView . isLocalExtensionsQuery ( query . value ) || / @ b u i l t i n / . test ( query . value ) ) {
239244 return this . queryLocal ( query , options ) ;
240245 }
241- return this . queryGallery ( query , options , token ) ;
246+ return this . queryGallery ( query , options , token )
247+ . then ( null , e => {
248+ console . warn ( 'Error querying extensions gallery' , getErrorMessage ( e ) ) ;
249+ return Promise . reject ( new ExtensionListViewWarning ( localize ( 'galleryError' , "We cannot connect to the Extensions Marketplace at this time, please try again later." ) ) ) ;
250+ } ) ;
242251 }
243252
244253 private async queryByIds ( ids : string [ ] , options : IQueryOptions , token : CancellationToken ) : Promise < IPagedModel < IExtension > > {
@@ -696,23 +705,30 @@ export class ExtensionsListView extends ViewletPanel {
696705 } ) ;
697706 }
698707
699- private setModel ( model : IPagedModel < IExtension > , isGalleryError ?: boolean ) {
708+ private setModel ( model : IPagedModel < IExtension > , error ?: any ) {
700709 if ( this . list ) {
701710 this . list . model = new DelayedPagedModel ( model ) ;
702711 this . list . scrollTop = 0 ;
703712 const count = this . count ( ) ;
704713
705714 toggleClass ( this . extensionsList , 'hidden' , count === 0 ) ;
706- toggleClass ( this . messageBox , 'hidden' , count > 0 ) ;
715+ toggleClass ( this . messageContainer , 'hidden' , count > 0 ) ;
707716 this . badge . setCount ( count ) ;
708717
709718 if ( count === 0 && this . isBodyVisible ( ) ) {
710- this . messageBox . textContent = isGalleryError ? localize ( 'galleryError' , "We cannot connect to the Extensions Marketplace at this time, please try again later." ) : localize ( 'no extensions found' , "No extensions found." ) ;
711- if ( isGalleryError ) {
712- alert ( this . messageBox . textContent ) ;
719+ if ( error ) {
720+ if ( error instanceof ExtensionListViewWarning ) {
721+ this . messageStatus . className = 'message-status warning' ;
722+ this . messageBox . textContent = getErrorMessage ( error ) ;
723+ } else {
724+ this . messageStatus . className = 'message-status error' ;
725+ this . messageBox . textContent = localize ( 'error' , "Error while loading extensions. {0}" , getErrorMessage ( error ) ) ;
726+ }
727+ } else {
728+ this . messageStatus . className = '' ;
729+ this . messageBox . textContent = localize ( 'no extensions found' , "No extensions found." ) ;
713730 }
714- } else {
715- this . messageBox . textContent = '' ;
731+ alert ( this . messageBox . textContent ) ;
716732 }
717733 }
718734 }
0 commit comments