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' } } }