Skip to content

Commit a03caec

Browse files
committed
1 parent 7ee7705 commit a03caec

4 files changed

Lines changed: 59 additions & 15 deletions

File tree

src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { localize } from 'vs/nls';
77
import { dispose, Disposable } from 'vs/base/common/lifecycle';
88
import { assign } from 'vs/base/common/objects';
99
import { Event, Emitter } from 'vs/base/common/event';
10-
import { isPromiseCanceledError } from 'vs/base/common/errors';
10+
import { isPromiseCanceledError, getErrorMessage } from 'vs/base/common/errors';
1111
import { PagedModel, IPagedModel, IPager, DelayedPagedModel } from 'vs/base/common/paging';
1212
import { SortBy, SortOrder, IQueryOptions, IExtensionTipsService, IExtensionRecommendation, IExtensionManagementServer, IExtensionManagementServerService } from 'vs/platform/extensionManagement/common/extensionManagement';
1313
import { 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+
7274
export 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) || /@builtin/.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
}

src/vs/workbench/contrib/extensions/electron-browser/media/extensionsViewlet.css

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
}
3939

4040
.extensions-viewlet > .extensions .extensions-list.hidden,
41-
.extensions-viewlet > .extensions .message.hidden {
41+
.extensions-viewlet > .extensions .message-container.hidden {
4242
display: none;
4343
visibility: hidden;
4444
}
@@ -51,9 +51,35 @@
5151
flex: 1;
5252
}
5353

54-
.extensions-viewlet > .extensions .message {
54+
.extensions-viewlet > .extensions .message-container {
5555
padding: 5px 9px 5px 16px;
5656
cursor: default;
57+
display: flex;
58+
}
59+
60+
.extensions-viewlet > .extensions .message-container .message-status {
61+
height: 16px;
62+
width: 16px;
63+
}
64+
65+
.extensions-viewlet > .extensions .message-container .message-status.warning {
66+
background: url('status-warning.svg') center center no-repeat;
67+
}
68+
69+
.extensions-viewlet > .extensions .message-container .message-status.error {
70+
background: url('status-error.svg') center center no-repeat;
71+
}
72+
73+
.vs-dark .extensions-viewlet > .extensions .message-container .message-status.warning {
74+
background: url('status-warning-inverse.svg') center center no-repeat;
75+
}
76+
77+
.vs-dark .extensions-viewlet > .extensions .message-container .message-status.error {
78+
background: url('status-error-inverse.svg') center center no-repeat;
79+
}
80+
81+
.extensions-viewlet > .extensions .message-container .message {
82+
padding-left: 5px;
5783
}
5884

5985
.extensions-viewlet > .extensions .monaco-list-row > .bookmark {
Lines changed: 1 addition & 0 deletions
Loading
Lines changed: 1 addition & 0 deletions
Loading

0 commit comments

Comments
 (0)