Merge pull request #717 from torhve/serviceworker
use service workers for notifications
This commit is contained in:
commit
1d07c05621
2 changed files with 77 additions and 29 deletions
|
@ -1,8 +1,9 @@
|
||||||
var weechat = angular.module('weechat');
|
var weechat = angular.module('weechat');
|
||||||
|
|
||||||
weechat.factory('notifications', ['$rootScope', '$log', 'models', 'settings', function($rootScope, $log, models, settings) {
|
weechat.factory('notifications', ['$rootScope', '$log', 'models', 'settings', function($rootScope, $log, models, settings) {
|
||||||
// Ask for permission to display desktop notifications
|
var serviceworker = false;
|
||||||
var notifications = [];
|
var notifications = [];
|
||||||
|
// Ask for permission to display desktop notifications
|
||||||
var requestNotificationPermission = function() {
|
var requestNotificationPermission = function() {
|
||||||
// Firefox
|
// Firefox
|
||||||
if (window.Notification) {
|
if (window.Notification) {
|
||||||
|
@ -22,6 +23,58 @@ weechat.factory('notifications', ['$rootScope', '$log', 'models', 'settings', fu
|
||||||
window.webkitNotifications.requestPermission();
|
window.webkitNotifications.requestPermission();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ('serviceWorker' in navigator) {
|
||||||
|
$log.info('Service Worker is supported');
|
||||||
|
navigator.serviceWorker.register('serviceworker.js').then(function(reg) {
|
||||||
|
$log.info('Service Worker install:', reg);
|
||||||
|
serviceworker = true;
|
||||||
|
}).catch(function(err) {
|
||||||
|
$log.info('Service Worker err:', err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var showNotification = function(title, body) {
|
||||||
|
if (serviceworker) {
|
||||||
|
navigator.serviceWorker.ready.then(function(registration) {
|
||||||
|
registration.showNotification(title, {
|
||||||
|
body: body,
|
||||||
|
icon: 'assets/img/glowing_bear_128x128.png',
|
||||||
|
vibrate: [200, 100, 200, 100, 200, 100, 200],
|
||||||
|
tag: 'gb-highlight-vib'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
var notification = new Notification(title, {
|
||||||
|
body: body,
|
||||||
|
icon: 'assets/img/favicon.png'
|
||||||
|
});
|
||||||
|
|
||||||
|
// Save notification, so we can close all outstanding ones when disconnecting
|
||||||
|
notification.id = notifications.length;
|
||||||
|
notifications.push(notification);
|
||||||
|
|
||||||
|
// Cancel notification automatically
|
||||||
|
var timeout = 15*1000;
|
||||||
|
notification.onshow = function() {
|
||||||
|
setTimeout(function() {
|
||||||
|
notification.close();
|
||||||
|
}, timeout);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Click takes the user to the buffer
|
||||||
|
notification.onclick = function() {
|
||||||
|
models.setActiveBuffer(buffer.id);
|
||||||
|
window.focus();
|
||||||
|
notification.close();
|
||||||
|
};
|
||||||
|
|
||||||
|
// Remove from list of active notifications
|
||||||
|
notification.onclose = function() {
|
||||||
|
delete notifications[this.id];
|
||||||
|
};
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -104,34 +157,7 @@ weechat.factory('notifications', ['$rootScope', '$log', 'models', 'settings', fu
|
||||||
}
|
}
|
||||||
title += buffer.shortName + " (" + buffer.server + ")";
|
title += buffer.shortName + " (" + buffer.server + ")";
|
||||||
|
|
||||||
var notification = new Notification(title, {
|
showNotification(title, body);
|
||||||
body: body,
|
|
||||||
icon: 'assets/img/favicon.png'
|
|
||||||
});
|
|
||||||
|
|
||||||
// Save notification, so we can close all outstanding ones when disconnecting
|
|
||||||
notification.id = notifications.length;
|
|
||||||
notifications.push(notification);
|
|
||||||
|
|
||||||
// Cancel notification automatically
|
|
||||||
var timeout = 15*1000;
|
|
||||||
notification.onshow = function() {
|
|
||||||
setTimeout(function() {
|
|
||||||
notification.close();
|
|
||||||
}, timeout);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Click takes the user to the buffer
|
|
||||||
notification.onclick = function() {
|
|
||||||
models.setActiveBuffer(buffer.id);
|
|
||||||
window.focus();
|
|
||||||
notification.close();
|
|
||||||
};
|
|
||||||
|
|
||||||
// Remove from list of active notifications
|
|
||||||
notification.onclose = function() {
|
|
||||||
delete notifications[this.id];
|
|
||||||
};
|
|
||||||
|
|
||||||
if (settings.soundnotification) {
|
if (settings.soundnotification) {
|
||||||
// TODO fill in a sound file
|
// TODO fill in a sound file
|
||||||
|
|
22
serviceworker.js
Normal file
22
serviceworker.js
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
// File needs to be stored in the root of the app.
|
||||||
|
|
||||||
|
this.addEventListener('install', function(event) {
|
||||||
|
event.waitUntil(
|
||||||
|
caches.open('v1').then(function(cache) {
|
||||||
|
return cache.addAll([
|
||||||
|
'assets/img/glowing_bear_128x128.png',
|
||||||
|
]);
|
||||||
|
})
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.addEventListener('push', function(event) {
|
||||||
|
// TODO, support GCM here
|
||||||
|
var title = 'Push message';
|
||||||
|
event.waitUntil(
|
||||||
|
self.registration.showNotification(title, {
|
||||||
|
body: 'The Message',
|
||||||
|
icon: 'assets/img/favicon.png',
|
||||||
|
tag: 'my-tag'
|
||||||
|
}));
|
||||||
|
});
|
Loading…
Reference in a new issue