-
Notifications
You must be signed in to change notification settings - Fork 30.5k
/
Copy pathnotificationService.ts
116 lines (86 loc) · 3.24 KB
/
notificationService.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { INotificationService, INotification, INotificationHandle, Severity, NotificationMessage, INotificationActions, IPromptChoice } from 'vs/platform/notification/common/notification';
import { INotificationsModel, NotificationsModel } from 'vs/workbench/common/notifications';
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { TPromise } from 'vs/base/common/winjs.base';
import { Action } from 'vs/base/common/actions';
import { once } from 'vs/base/common/event';
export class NotificationService implements INotificationService {
public _serviceBrand: any;
private _model: INotificationsModel;
private toDispose: IDisposable[];
constructor() {
this.toDispose = [];
const model = new NotificationsModel();
this.toDispose.push(model);
this._model = model;
}
public get model(): INotificationsModel {
return this._model;
}
public info(message: NotificationMessage | NotificationMessage[]): void {
if (Array.isArray(message)) {
message.forEach(m => this.info(m));
return;
}
this.model.notify({ severity: Severity.Info, message });
}
public warn(message: NotificationMessage | NotificationMessage[]): void {
if (Array.isArray(message)) {
message.forEach(m => this.warn(m));
return;
}
this.model.notify({ severity: Severity.Warning, message });
}
public error(message: NotificationMessage | NotificationMessage[]): void {
if (Array.isArray(message)) {
message.forEach(m => this.error(m));
return;
}
this.model.notify({ severity: Severity.Error, message });
}
public notify(notification: INotification): INotificationHandle {
return this.model.notify(notification);
}
public prompt(severity: Severity, message: string, choices: IPromptChoice[], onCancel?: () => void): INotificationHandle {
let handle: INotificationHandle;
let choiceClicked = false;
// Convert choices into primary/secondary actions
const actions: INotificationActions = { primary: [], secondary: [] };
choices.forEach((choice, index) => {
const action = new Action(`workbench.dialog.choice.${index}`, choice.label, null, true, () => {
choiceClicked = true;
// Pass to runner
choice.run();
// Close notification unless we are told to keep open
if (!choice.keepOpen) {
handle.close();
}
return TPromise.as(void 0);
});
if (!choice.isSecondary) {
actions.primary.push(action);
} else {
actions.secondary.push(action);
}
});
// Show notification with actions
handle = this.notify({ severity, message, actions });
once(handle.onDidClose)(() => {
// Cleanup when notification gets disposed
dispose(...actions.primary, ...actions.secondary);
// Indicate cancellation to the outside if no action was executed
if (!choiceClicked && typeof onCancel === 'function') {
onCancel();
}
});
return handle;
}
public dispose(): void {
this.toDispose = dispose(this.toDispose);
}
}