You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
195 lines
5.6 KiB
195 lines
5.6 KiB
10 years ago
|
/*
|
||
|
* 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,
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// 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;
|
||
|
}
|
||
|
|
||
|
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;
|
||
|
|
||
|
}));
|