mirror of
https://github.com/atom/atom.git
synced 2026-01-23 13:58:08 -05:00
119 lines
2.8 KiB
JavaScript
119 lines
2.8 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'
|
|
}
|
|
}
|
|
}
|