pwaParams() : Encart des paramètres de la PWAToujours dans l'optique d'offrir une expérience utilisateur la plus proche possible des applications natives,
la fonction pwaParams() va permettre de proposer à l'utilisateur un encart de configuration permettant d'afficher la version de la PWA,
ainsi qu'une gestion des autorisations.
Cette fonction nécessite la présence des fonctions pwaNotifications() et pwaGeolocation(),
qui vont permettre de gérer les boutons d'autorisations de l'encart paramètres.
Cette fonction prend 3 paramètres :
version : Affiche / Cache la version de la PWA dans l'encart de paramètres (Booléen, valeur par défaut : true)notifications : Affiche / Cache le bouton d'autorisation des notifications dans l'encart de paramètres (Booléen, valeur par défaut : true)geolocation : Affiche / Cache le bouton d'autorisation de la géolocalisation dans l'encart de paramètres (Booléen, valeur par défaut : true)
const pwaParams = async (version = true, notifications = true, geolocation = true)
Afin que la fonction soit fonctionnelle, il faut ajouter ces éléments au DOM :
pwa-params : conteneur de l'encart des paramètres de la PWApwa-params-btn : bouton d'ouverture de l'encart des paramètres de la PWApwa-params-close-btn : bouton de fermeture de l'encart des paramètres de la PWApwa-params-version : conteneur du bloc de la version de la PWApwa-params-permission : conteneur du bloc des permissions de la PWApwa-params-permission-notification : conteneur de la permission de notificationspwa-params-permission-geolocation : conteneur de la permission de géolocalisationpwa-name : conteneur du nom de la PWApwa-version : conteneur du la version de la PWApwa-permission-notifications-btn : bouton de permission des notificationspwa-permission-geolocation-btn : bouton de permission de la géolocalisationpwa-permission-remove : conteneur de la révocation des permissions
<button class="pwa-params-btn">
Params
</button>
<div class="pwa-params">
<div class="pwa-params-version">
<p>Version</p>
<p>
<span class="pwa-name"></span>
<span class="pwa-version"></span>
</p>
</div>
<div class="pwa-params-permission">
<p>Permissions</p>
<ul>
<li class="pwa-params-permission-notification">
<button class="pwa-permission-notifications-btn">
</button>
<span>I authorize to receive notifications</span>
</li>
<li class="pwa-params-permission-geolocation">
<button class="pwa-permission-geolocation-btn">
</button>
<span>I authorize geolocation</span>
</li>
</ul>
<div class="pwa-permission-remove">
To remove permission, please go to your device or browser settings
</div>
</div>
<button class="pwa-params-close-btn">
Close
</button>
</div>
On cache les éléments
.pwa-params,
.pwa-params-btn,
.pwa-params-version,
.pwa-params-permission,
.pwa-params-permission-notification,
.pwa-params-permission-geolocation,
.pwa-permission-remove {
display: none;
}
Si les éléments ont la classe is-visible, on les affichent
.pwa-params.is-visible,
.pwa-params-btn.is-visible,
.pwa-params-version.is-visible,
.pwa-params-permission.is-visible,
.pwa-params-permission-notification.is-visible,
.pwa-params-permission-geolocation.is-visible,
.pwa-permission-remove.is-visible {
display: block;
}
const pwaParams = async (
version = true,
notifications = true,
geolocation = true
) => {
...
}
Nous mettons en variable les éléments du DOM à manipuler
const pwaParams = document.querySelector('.pwa-params')
const pwaParamsButton = document.querySelector('.pwa-params-btn')
const pwaParamsButtonClose = document.querySelector('.pwa-params-close-btn')
const pwaParamsVersion = document.querySelector('.pwa-params-version')
const pwaParamsPermission = document.querySelector('.pwa-params-permission')
const pwaParamsPermissionNotification = document.querySelector('.pwa-params-permission-notification')
const pwaParamsPermissionGeolocation = document.querySelector('.pwa-params-permission-geolocation')
const pwaAddName = document.querySelector('.pwa-name')
const pwaAddVersion = document.querySelector('.pwa-version')
On met en variable l'instance du serviceworker de l'application, qui va nous servir à récupérer la version de la PWA
const registration = await navigator.serviceWorker.getRegistration()
On fait une requête sur le fichier webmanifest et on stocke la réponse dans une variable
const webmanifestResponse = await fetch(new Request(document.querySelector('link[rel="manifest"]').href))
On Convertit la réponse de JSON en un objet JavaScript et la stocke dans une variable
const webmanifest = await webmanifestResponse.json()
On récupère la valeur du paramètre 'utm_source' de la chaîne de l'URL de la page en cours
const utm_source = new URLSearchParams(window.location.search).get('utm_source')
Si le paramètre utm_source dans l'URL est égal à 'homescreen', on affiche le bouton
if(utm_source == 'homescreen') {
pwaParamsButton.classList.add('is-visible')
}
const pwaVersion = async () => {
On envoie un message au Service Worker actif demandant la version PWA
registration.active.postMessage('GET_VERSION')
Lorsque le Service Worker reçoit un message
navigator.serviceWorker.addEventListener('message', function(event) {
Si le message contient des données, on injecte dans le dom la valeur reçue
if (event.data) {
pwaAddVersion.innerText = event.data
}
Si le paramètre 'version' de la fonction a la valeur true
if(version) {
On affiche le conteneur de la version
pwaParamsVersion.classList.add('is-visible')
On définit le nom de la PWA avec les données du fichier Webmanifest
pwaAddName.innerText = webmanifest.name
On définit la version de la PWA avec les données du Service Worker
pwaVersion()
Si les paramètres 'notifications' et 'géolocalisation' sont tous les deux à false, on cache le conteneur des autorisations
if (!(notifications) && !(geolocation)) {
pwaParamsPermission.classList.remove('is-visible')
Sinon, on l'affiche
} else {
pwaParamsPermission.classList.add('is-visible')
}
Si le paramètre 'notifications' est à true
if (notifications) {
On affiche le conteneur e l'autorisation des notifications
pwaParamsPermissionNotification.classList.add('is-visible')
Et on appelle la fonction de demande de d'autorisation des notifications
pwaNotifications()
Si le paramètre 'notifications' est à true
if (geolocation) {
On affiche le conteneur e l'autorisation de la géolocalisation
pwaParamsPermissionGeolocation.classList.add('is-visible')
Et on appelle la fonction de demande de d'autorisation de la géolocalisation
pwaGeolocation()
Au clic sur le bouton des paramètres de la PWA
pwaParamsButton.addEventListener('click', () => {
On affiche le conteneur des paramètres de la PWA
pwaParams.classList.add('is-visible')
Au clic sur le bouton de fermeture du conteneur des paramètres de la PWA
pwaParamsButtonClose.addEventListener('click', () => {
On cache le conteneur des paramètres de la PWA
pwaParams.classList.remove('is-visible')
Voici l'appel de la fonction utilisé sur pwabunga.js
pwaParams()
pwaParams
const pwaParams = async (
version = true,
notifications = true,
geolocation = true
) => {
const pwaParams = document.querySelector('.pwa-params')
const pwaParamsButton = document.querySelector('.pwa-params-btn')
const pwaParamsButtonClose = document.querySelector('.pwa-params-close-btn')
const pwaParamsVersion = document.querySelector('.pwa-params-version')
const pwaParamsPermission = document.querySelector('.pwa-params-permission')
const pwaParamsPermissionNotification = document.querySelector('.pwa-params-permission-notification')
const pwaParamsPermissionGeolocation = document.querySelector('.pwa-params-permission-geolocation')
const pwaAddName = document.querySelector('.pwa-name')
const pwaAddVersion = document.querySelector('.pwa-version')
const registration = await navigator.serviceWorker.getRegistration()
const webmanifestResponse = await fetch(new Request(document.querySelector('link[rel="manifest"]').href))
const webmanifest = await webmanifestResponse.json()
const utm_source = new URLSearchParams(window.location.search).get('utm_source')
if(utm_source == 'homescreen') {
pwaParamsButton.classList.add('is-visible')
}
const pwaVersion = async () => {
registration.active.postMessage('GET_VERSION')
navigator.serviceWorker.addEventListener('message', function(event) {
if (event.data) {
pwaAddVersion.innerText = event.data
}
})
}
if(version) {
pwaParamsVersion.classList.add('is-visible')
pwaAddName.innerText = webmanifest.name
pwaVersion()
}
if (!(notifications) && !(geolocation)) {
pwaParamsPermission.classList.remove('is-visible')
} else {
pwaParamsPermission.classList.add('is-visible')
}
if (notifications) {
pwaParamsPermissionNotification.classList.add('is-visible')
pwaNotifications()
}
if (geolocation) {
pwaParamsPermissionGeolocation.classList.add('is-visible')
pwaGeolocation()
}
pwaParamsButton.addEventListener('click', () => {
pwaParams.classList.add('is-visible')
})
pwaParamsButtonClose.addEventListener('click', () => {
pwaParams.classList.remove('is-visible')
})
}
pwaInstall() : Promotion et bouton d'installation de la PWApwaUpdate() : Mise à jour de l'applicationpwaShare() : Utilisation du partage natif de l'appareilpwaParams() : Encart des paramètres de la PWA