Skip to content

Instantly share code, notes, and snippets.

@Kreijstal
Created August 5, 2014 00:42
Show Gist options
  • Save Kreijstal/58a29b05e2970b297de1 to your computer and use it in GitHub Desktop.
Save Kreijstal/58a29b05e2970b297de1 to your computer and use it in GitHub Desktop.
Notify wrapper
var Notify=function (w, d) {
'use strict';
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 (typeof this.options.notifyShow === 'function') {
this.onShowCallback = this.options.notifyShow;
}
//callback when notification is closed
if (typeof this.options.notifyClose === 'function') {
this.onCloseCallback = this.options.notifyClose;
}
//callback when notification is clicked
if (typeof this.options.notifyClick === 'function') {
this.onClickCallback = this.options.notifyClick;
}
//callback when notification throws error
if (typeof this.options.notifyError === 'function') {
this.onErrorCallback = this.options.notifyError;
}
}
}
// return true if the browser supports HTML5 Notification
Notify.isSupported = function () {
if ('Notification' in w) {
return true;
}
return false;
};
// returns true if the permission is not granted
Notify.needsPermission = function () {
if (Notify.isSupported() && Notification.permission === 'granted') {
return false;
}
return true;
};
// asks the user for permission to display notifications. Then calls the callback functions is supplied.
Notify.requestPermission = function (onPermissionGrantedCallback, onPermissionDeniedCallback) {
if (Notify.isSupported()) {
w.Notification.requestPermission(function (perm) {
switch (perm) {
case 'granted':
if (typeof onPermissionGrantedCallback === 'function') {
onPermissionGrantedCallback();
}
break;
case 'denied':
if (typeof onPermissionDeniedCallback === 'function') {
onPermissionDeniedCallback();
}
break;
}
});
}
};
Notify.prototype.show = function () {
var that = this;
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;
}(window,document);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment