mirror of
https://github.com/atom/atom.git
synced 2026-04-28 03:01:47 -04:00
129 lines
2.9 KiB
JavaScript
129 lines
2.9 KiB
JavaScript
const { Emitter } = require('event-kit');
|
|
const _ = require('underscore-plus');
|
|
|
|
// Public: A notification to the user containing a message and type.
|
|
module.exports = class Notification {
|
|
constructor(type, message, options = {}) {
|
|
this.type = type;
|
|
this.message = message;
|
|
this.options = options;
|
|
this.emitter = new Emitter();
|
|
this.timestamp = new Date();
|
|
this.dismissed = true;
|
|
if (this.isDismissable()) this.dismissed = false;
|
|
this.displayed = false;
|
|
this.validate();
|
|
}
|
|
|
|
validate() {
|
|
if (typeof this.message !== 'string') {
|
|
throw new Error(
|
|
`Notification must be created with string message: ${this.message}`
|
|
);
|
|
}
|
|
|
|
if (!_.isObject(this.options) || Array.isArray(this.options)) {
|
|
throw new Error(
|
|
`Notification must be created with an options object: ${this.options}`
|
|
);
|
|
}
|
|
}
|
|
|
|
/*
|
|
Section: Event Subscription
|
|
*/
|
|
|
|
// Public: Invoke the given callback when the notification is dismissed.
|
|
//
|
|
// * `callback` {Function} to be called when the notification is dismissed.
|
|
//
|
|
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
|
|
onDidDismiss(callback) {
|
|
return this.emitter.on('did-dismiss', callback);
|
|
}
|
|
|
|
// Public: Invoke the given callback when the notification is displayed.
|
|
//
|
|
// * `callback` {Function} to be called when the notification is displayed.
|
|
//
|
|
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
|
|
onDidDisplay(callback) {
|
|
return this.emitter.on('did-display', callback);
|
|
}
|
|
|
|
getOptions() {
|
|
return this.options;
|
|
}
|
|
|
|
/*
|
|
Section: Methods
|
|
*/
|
|
|
|
// Public: Returns the {String} type.
|
|
getType() {
|
|
return this.type;
|
|
}
|
|
|
|
// Public: Returns the {String} message.
|
|
getMessage() {
|
|
return this.message;
|
|
}
|
|
|
|
getTimestamp() {
|
|
return this.timestamp;
|
|
}
|
|
|
|
getDetail() {
|
|
return this.options.detail;
|
|
}
|
|
|
|
isEqual(other) {
|
|
return (
|
|
this.getMessage() === other.getMessage() &&
|
|
this.getType() === other.getType() &&
|
|
this.getDetail() === other.getDetail()
|
|
);
|
|
}
|
|
|
|
// Extended: Dismisses the notification, removing it from the UI. Calling this
|
|
// programmatically will call all callbacks added via `onDidDismiss`.
|
|
dismiss() {
|
|
if (!this.isDismissable() || this.isDismissed()) return;
|
|
this.dismissed = true;
|
|
this.emitter.emit('did-dismiss', this);
|
|
}
|
|
|
|
isDismissed() {
|
|
return this.dismissed;
|
|
}
|
|
|
|
isDismissable() {
|
|
return !!this.options.dismissable;
|
|
}
|
|
|
|
wasDisplayed() {
|
|
return this.displayed;
|
|
}
|
|
|
|
setDisplayed(displayed) {
|
|
this.displayed = displayed;
|
|
this.emitter.emit('did-display', this);
|
|
}
|
|
|
|
getIcon() {
|
|
if (this.options.icon != null) return this.options.icon;
|
|
switch (this.type) {
|
|
case 'fatal':
|
|
return 'bug';
|
|
case 'error':
|
|
return 'flame';
|
|
case 'warning':
|
|
return 'alert';
|
|
case 'info':
|
|
return 'info';
|
|
case 'success':
|
|
return 'check';
|
|
}
|
|
}
|
|
};
|