-
Notifications
You must be signed in to change notification settings - Fork 4
/
service-worker.js
157 lines (135 loc) · 5.1 KB
/
service-worker.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
var OFFLINE_CACHE = 'offline';
var OFFLINE_URL = 'html/offline.html';
self.addEventListener('install', function (event) {
var offlineRequest = new Request(OFFLINE_URL);
event.waitUntil(
fetch(offlineRequest).then(function (response) {
return caches.open(OFFLINE_CACHE).then(function (cache) {
return cache.put(offlineRequest, response);
});
})
);
});
self.addEventListener('fetch', function (event) {
if (event.request.mode === 'navigate' ||
(event.request.method === 'GET' &&
event.request.headers.get('accept').includes('text/html'))) {
// a GET request should not have any body (blob), but sometimes it does
event.waitUntil(event.request.blob().then(function(blob) {
if (blob.size == 0) {
return event.respondWith(
fetch(event.request).catch(function () {
// offline
return caches.open(OFFLINE_CACHE).then(function (cache) {
return cache.match(OFFLINE_URL);
});
})
);
}
}));
}
});
self.addEventListener('push', function (event) {
if (!(self.Notification && self.Notification.permission === 'granted')) {
return;
}
var sendNotification = function(message, tag) {
// on actualise la page des notifications ou/et le compteur de notifications
self.refreshNotifications();
var title = "Phy'sbook",
icon = 'images/icons/icon-192.png';
message = message || 'Il y a du neuf !';
tag = tag || 'general';
return self.registration.showNotification(title, {
body: message,
icon: icon,
tag: tag
});
};
if (event.data) {
var data = event.data.json();
event.waitUntil(
sendNotification(data.message, data.tag)
);
} else {
event.waitUntil(
self.registration.pushManager.getSubscription().then(function(subscription) {
if (!subscription) {
return;
}
return fetch('api/notifications/last?endpoint=' + encodeURIComponent(subscription.endpoint)).then(function (response) {
if (response.status !== 200) {
throw new Error();
}
// Examine the text in the response
return response.json().then(function (data) {
if (data.error || !data.notification) {
throw new Error();
}
return sendNotification(data.notification.message);
});
}).catch(function () {
return sendNotification();
});
})
);
}
});
self.refreshNotifications = function(clientList) {
if (clientList == undefined) {
clients.matchAll({ type: "window" }).then(function (clientList) {
self.refreshNotifications(clientList);
});
} else {
for (var i = 0; i < clientList.length; i++) {
var client = clientList[i];
if (client.url.search(/notifications/i) >= 0) {
// si la page des notifications est ouverte on la recharge
client.postMessage('reload');
}
// si on n'est pas sur la page des notifications on recharge le compteur
client.postMessage('refreshNotifications');
}
}
};
self.addEventListener('notificationclick', function (event) {
// fix http://crbug.com/463146
event.notification.close();
event.waitUntil(
clients.matchAll({
type: "window"
})
.then(function (clientList) {
// si la page des notifications est ouverte on l'affiche en priorité
for (var i = 0; i < clientList.length; i++) {
var client = clientList[i];
if (client.url.search(/notifications/i) >= 0 && 'focus' in client) {
return client.focus();
}
}
// sinon s'il y a quand même une page du site ouverte on l'affiche
if (clientList.length && 'focus' in client) {
return client.focus();
}
// sinon on ouvre la page des notifications
if (clients.openWindow) {
return clients.openWindow('notifications');
}
})
);
});
self.addEventListener('message', function (event) {
var message = event.data;
switch (message) {
case 'dispatchRemoveNotifications':
clients.matchAll({ type: "window" }).then(function (clientList) {
for (var i = 0; i < clientList.length; i++) {
clientList[i].postMessage('removeNotifications');
}
});
break;
default:
console.warn("Message '" + message + "' not handled.");
break;
}
});