-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.js
136 lines (113 loc) · 5.29 KB
/
main.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
const technosDiv = document.querySelector('#technos');
function loadTechnologies(technos) {
fetch('https://us-central1-pwa-technos-8658f.cloudfunctions.net/getTechnos')
.then(response => {
response.json()
.then(technos => {
const allTechnos = technos.map(t => `
<div class="card">
<div class="card-body">
<h5 class="card-title">${t.name}</h5>
<p class="card-text">${t.description}</p>
<a href="${t.url}" class="card-link">site de ${t.name}</a>
</div>
</div>`)
.join('');
technosDiv.innerHTML = allTechnos;
});
})
.catch(console.error);
}
loadTechnologies(technos);
// 3.2
if(navigator.serviceWorker) {
// Enregistrement du service worker
navigator.serviceWorker
.register('sw.js')
// 8.4 Récupération ou création d'une souscription auprès d'un push service
.then(registration =>{
// tentative d'obtention d'une souscription
// public vapid key générée par web-push, en prod appel d'api via fetch plutôt que static
const publicKey = "BO-S7qEQFaR6Ajd64lYW7nhn6bNO-NBJwvrQiPxriFQClC0Hemf2loWjXnZ9CuQLK1jVonxSPOCeUvEp3ZUvVWA";
registration.pushManager.getSubscription().then(subscription => {
// Déjà une souscription, on l'affiche
if(subscription){
console.log("subscription", subscription);
// Extraction des données permettant ensuite l'envoi de notification
extractKeysFromArrayBuffer(subscription);
return subscription;
}
// Pas de souscription
else{
// demande de souscription (clef convertie en buffer pour faire la demande)
const convertedKey = urlBase64ToUint8Array(publicKey);
return registration.pushManager.subscribe({
userVisibleOnly: true, // accord de confiance
applicationServerKey: convertedKey
})
.then(newSubscription => {
// Affiche le résultat pour vérifier
console.log('newSubscription', newSubscription);
extractKeysFromArrayBuffer(newSubscription);
return newSubscription;
})
}
})
})
.catch(err => console.error('service worker NON enregistré', err));
}
// 8.4 Récupération ou création d'une souscription auprès d'un push service
// Fonction pour récupérer les clés de la souscription afin de les utiliser pour notification
function extractKeysFromArrayBuffer(subscription){
// no more keys proprety directly visible on the subscription objet. So you have to use getKey()
const keyArrayBuffer = subscription.getKey('p256dh');
const authArrayBuffer = subscription.getKey('auth');
const p256dh = btoa(String.fromCharCode.apply(null, new Uint8Array(keyArrayBuffer)));
const auth = btoa(String.fromCharCode.apply(null, new Uint8Array(authArrayBuffer)));
console.log('p256dh key', keyArrayBuffer, p256dh);
console.log('auth key', authArrayBuffer, auth);
// Paramètres nécessaires à l'objet de notification pushSubscription
console.log('endpoint :');
console.dir(subscription.endpoint);
console.log('p256dh key :', p256dh);
console.log('auth key :', auth);
}
// 8.4 Récupération ou création d'une souscription auprès d'un push service
// Fonction pour convertir string en array buffer pour envoie au push service
function urlBase64ToUint8Array(base64String) {
const padding = '='.repeat((4 - base64String.length % 4) % 4);
const base64 = (base64String + padding)
.replace(/-/g, '+')
.replace(/_/g, '/');
const rawData = window.atob(base64);
const outputArray = new Uint8Array(rawData.length);
for (let i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i);
}
return outputArray;
}
//..
//7.1 Notifications non persistantes
// // Vérifie si la fonctionalité est disponible et si
// l'utilisateur n'a pas refusé les notifications
// if(window.Notification && window.Notification !== "denied"){
// // demande une permission
// Notification.requestPermission(perm => {
// // vérifie si la permission est acceptée par l'utilisateur
// // 3 valeurs possibles : default | granted | denied
// if(perm === "granted"){
// // 7.2 Option de la notification
// const options = {
// body : "Loris Plasson Simoni NOTIF",
// icon : "images/icons/icon-72x72.png"
// }
// // On crée une nouvelle notification
// // 7.2 On passe les options en deuxième argument
// const notif = new Notification("Hello notification", options);
// }
// else{
// // Notification refusée
// console.log("Notification refusée");
// }
// })
// }