UNPKG

react-scripts

Version:
150 lines (121 loc) 4.36 kB
/** * Wrapper for the notifu 1.6 (http://www.paralint.com/projects/notifu/) Usage /t <value> The type of message to display values are: info The message is an informational message warn The message is an warning message error The message is an error message /d <value> The number of milliseconds to display (omit or 0 for infinit) /p <value> The title (or prompt) of the ballon /m <value> The message text /i <value> Specify an icon to use ("parent" uses the icon of the parent process) /e Enable ballon tips in the registry (for this user only) /q Do not play a sound when the tooltip is displayed /w Show the tooltip even if the user is in the quiet period that follows his very first login (Windows 7 and up) /xp Use IUserNotification interface event when IUserNotification2 is available // Kill codes: 2 = Timeout 3 = Clicked 4 = Closed or faded out */ var path = require('path'), notifier = path.resolve(__dirname, '../vendor/notifu/notifu'), utils = require('../lib/utils'), checkGrowl = require('../lib/checkGrowl'), Toaster = require('./toaster'), Growl = require('./growl'), os = require('os'), cloneDeep = require('lodash.clonedeep'); var EventEmitter = require('events').EventEmitter; var util = require('util'); var hasGrowl = void 0; module.exports = WindowsBalloon; function WindowsBalloon (options) { options = cloneDeep(options || {}); if (!(this instanceof WindowsBalloon)) { return new WindowsBalloon(options); } this.options = options; EventEmitter.call(this); } util.inherits(WindowsBalloon, EventEmitter); WindowsBalloon.prototype.notify = function (options, callback) { var fallback, notifierOptions = this.options; options = cloneDeep(options || {}); callback = callback || function () {}; if (typeof options === 'string') options = { title: 'node-notifier', message: options }; var actionJackedCallback = utils.actionJackerDecorator(this, options, callback, function (data) { if (data === 'activate') { return 'click'; } if (data === 'timeout') { return 'timeout'; } return false; }); if (!!this.options.withFallback && utils.isWin8()) { fallback = fallback || new Toaster(notifierOptions); return fallback.notify(options, callback); } if (!!this.options.withFallback && (!utils.isLessThanWin8() || hasGrowl === true)) { fallback = fallback || new Growl(notifierOptions); return fallback.notify(options, callback); } if (!this.options.withFallback || hasGrowl === false) { doNotification(options, notifierOptions, actionJackedCallback); return this; } checkGrowl(notifierOptions, function (hasGrowlResult) { hasGrowl = hasGrowlResult; if (hasGrowl) { fallback = fallback || new Growl(notifierOptions); return fallback.notify(options, callback); } doNotification(options, notifierOptions, actionJackedCallback); }); return this; }; var allowedArguments = ["t", "d", "p", "m", "i", "e", "q", "w", "xp"]; function doNotification (options, notifierOptions, callback) { var is64Bit = os.arch() === 'x64'; options = options || {}; options = utils.mapToNotifu(options); options.p = options.p || 'Node Notification:'; var fullNotifierPath = notifier + (is64Bit ? '64' : '') + '.exe'; var localNotifier = notifierOptions.customPath || fullNotifierPath; if (!options.m) { callback(new Error('Message is required.')); return this; } var argsList = utils.constructArgumentList(options, { wrapper: '', noEscape: true, explicitTrue: true, allowedArguments: allowedArguments }); if (!!options.wait) { return utils.fileCommand(localNotifier, argsList, function (error, data) { var action = fromErrorCodeToAction(error.code); if (action === 'error') return callback(error, data); return callback(null, action); }); } utils.immediateFileCommand(localNotifier, argsList, callback); } function fromErrorCodeToAction (errorCode) { switch (errorCode) { case 2: return 'timeout'; case 3: case 6: case 7: return 'activate'; case 4: return 'close'; default: return 'error'; } }