/* * Author: Alex Gibson * https://github.com/alexgibson/notify.js * License: MIT license */ (function(global, factory) { if (typeof define === 'function' && define.amd) { // AMD environment define(function() { return factory(global, global.document); }); } else if (typeof module !== 'undefined' && module.exports) { // CommonJS environment module.exports = factory(global, global.document); } else { // Browser environment global.Notify = factory(global, global.document); } } (typeof window !== 'undefined' ? window : this, function (w, d) { 'use strict'; function isFunction (item) { return typeof item === 'function'; } function Notify(title, options) { if (typeof title !== 'string') { throw new Error('Notify(): first arg (title) must be a string.'); } this.title = title; this.options = { icon: '', body: '', tag: '', notifyShow: null, notifyClose: null, notifyClick: null, notifyError: null, permissionGranted: null, permissionDenied: null, timeout: null }; this.permission = null; if (!Notify.isSupported) { return; } //User defined options for notification content if (typeof options === 'object') { for (var i in options) { if (options.hasOwnProperty(i)) { this.options[i] = options[i]; } } //callback when notification is displayed if (isFunction(this.options.notifyShow)) { this.onShowCallback = this.options.notifyShow; } //callback when notification is closed if (isFunction(this.options.notifyClose)) { this.onCloseCallback = this.options.notifyClose; } //callback when notification is clicked if (isFunction(this.options.notifyClick)) { this.onClickCallback = this.options.notifyClick; } //callback when notification throws error if (isFunction(this.options.notifyError)) { this.onErrorCallback = this.options.notifyError; } //callback when permission granted after request if (isFunction(this.options.permissionGranted)) { this.onPermissionGrantedCallback = this.options.permissionGranted; } //callback when permission denied after request if (isFunction(this.options.permissionDenied)) { this.onPermissionDeniedCallback = this.options.permissionDenied; } } } // true if the browser supports HTML5 Notification Notify.isSupported = 'Notification' in w; // true if the permission is not granted Notify.needsPermission = !(Notify.isSupported && Notification.permission === 'granted'); // returns current permission level ('granted', 'default', 'denied' or null) Notify.permissionLevel = (Notify.isSupported ? Notification.permission : null); // asks the user for permission to display notifications. Then calls the callback functions is supplied. Notify.requestPermission = function (onPermissionGrantedCallback, onPermissionDeniedCallback) { if (!Notify.isSupported) { return; } w.Notification.requestPermission(function (perm) { switch (perm) { case 'granted': Notify.needsPermission = false; if (isFunction(onPermissionGrantedCallback)) { onPermissionGrantedCallback(); } break; case 'denied': if (isFunction(onPermissionDeniedCallback)) { onPermissionDeniedCallback(); } break; } }); }; Notify.prototype.show = function () { if (!Notify.isSupported) { return; } if (Notify.permissionLevel === 'default' ) { Notify.requestPermission(this.onPermissionGrantedCallback, this.onPermissionDeniedCallback); } if (Notify.needsPermission) { return; } this.myNotify = new Notification(this.title, { 'body': this.options.body, 'tag' : this.options.tag, 'icon' : this.options.icon }); if (this.options.timeout && !isNaN(this.options.timeout)) { setTimeout(this.close.bind(this), this.options.timeout * 1000); } this.myNotify.addEventListener('show', this, false); this.myNotify.addEventListener('error', this, false); this.myNotify.addEventListener('close', this, false); this.myNotify.addEventListener('click', this, false); }; Notify.prototype.onShowNotification = function (e) { if (this.onShowCallback) { this.onShowCallback(e); } }; Notify.prototype.onCloseNotification = function (e) { if (this.onCloseCallback) { this.onCloseCallback(e); } this.destroy(); }; Notify.prototype.onClickNotification = function (e) { if (this.onClickCallback) { this.onClickCallback(e); } }; Notify.prototype.onErrorNotification = function (e) { if (this.onErrorCallback) { this.onErrorCallback(e); } this.destroy(); }; Notify.prototype.destroy = function () { this.myNotify.removeEventListener('show', this, false); this.myNotify.removeEventListener('error', this, false); this.myNotify.removeEventListener('close', this, false); this.myNotify.removeEventListener('click', this, false); }; Notify.prototype.close = function () { this.myNotify.close(); }; Notify.prototype.handleEvent = function (e) { switch (e.type) { case 'show': this.onShowNotification(e); break; case 'close': this.onCloseNotification(e); break; case 'click': this.onClickNotification(e); break; case 'error': this.onErrorNotification(e); break; } }; return Notify; }));