pwaInstall()
: Promotion et bouton d'installation de la PWASi la PWA répond aux critères d'installation, le navigateur déclenche un événement pour inviter l'utilisateur à l'installer.
Par exemple, sur Chrome Android, le navigateur affiche un bandeau proposant l'installation.
Il se peut que l'utilisateur ne connaisse pas le processus d'installation d'une PWA, et nous allons pouvoir améliorer cette expérience en le personnalisant.
À cet effet, la fonction pwaInstall()
va :
Afin que la fonction soit fonctionnelle, il faut ajouter ces éléments au DOM :
pwa-install-promotion
: conteneur de l'encart de promotion de l'installationpwa-install-promotion-close
: bouton de fermeture de l'encart de promotion de l'installationpwa-install-btn
: bouton d'installationpwa-install-confirm
: conteneur de l'encart de confirmation de l'installationpwa-install-confirm-close
: bouton de fermeture de l'encart de confirmation de l'installationpwa-loader
: Loader
<div class="pwa-install-promotion">
<button class="pwa-install-promotion-close">Close</button>
{{ content }}
<button class="pwa-install-btn">Install</button>
</div>
<div class="pwa-install-confirm">
<button class="pwa-install-confirm-close">Close</button>
{{ content }}
</div>
<div class="pwa-loader">
{{ loader }}
</div>
Si vous n'utilisez pas pwabunga-ui.css, voici le CSS à utiliser :
On cache les éléments utiles à la fonction
.pwa-install-promotion,
.pwa-install-confirm,
.pwa-install-btn,
.pwa-loader {
display: none;
}
Si l'élément a la classe is-visible
, on l'affiche
.pwa-install-promotion.is-visible,
.pwa-install-confirm.is-visible,
.pwa-install-btn.is-visible,
.pwa-loader.is-visible {
display: block;
}
const pwaInstall = async () => {
...
}
Nous mettons en variable les éléments du DOM à manipuler
const pwaInstallPromotion = document.querySelector('.pwa-install-promotion')
const pwaInstallPromotionClose = document.querySelector('.pwa-install-promotion-close')
const pwaInstallBtn = document.querySelector('.pwa-install-btn')
const pwaInstallConfirm = document.querySelector('.pwa-install-confirm')
const pwaInstallConfirmClose = document.querySelector('.pwa-install-confirm-close')
const pwaInstallLoader = document.querySelector('.pwa-loader')
On initialise deferredPrompt
que l'on utilisera par la suite pour afficher l'écran d'installation
let deferredPrompt
Pour afficher les éléments, on utilise l'événement beforeinstallprompt
window.addEventListener('beforeinstallprompt', (e) => {
On empêche l'apparition du bandeau affiché par défaut par le navigateur proposant l'installation
e.preventDefault()
On stock l'événement qu'on utilisera plus tard
deferredPrompt = e
On affiche l'encart de promotion de l'installation et le bouton d'installation.
pwaInstallPromotion.classList.add('is-visible')
pwaInstallBtn.classList.add('is-visible')
Maintenant que le bouton d'installation est affiché si l'installation n'a pas été encore effectuée, on rend fonctionnel ce bouton
Au clic sur le bouton d'installation
pwaInstallBtn.addEventListener('click', () => {
On affiche la demande d'installation
deferredPrompt.prompt()
On détecte si l'utilisateur a confirmé l'installation ou non
const { outcome } = await deferredPrompt.userChoice;
deferredPrompt
ayant été utilisé, il ne peut plus l'être
deferredPrompt = null
Si l'utilisateur a accepté l'installation, on cache le bouton d'installation
if (outcome === 'accepted') {
pwaInstallBtn.classList.remove('is-visible')
}
On utilise l'événement appinstalled
pour afficher l'encart de confirmation.
Cet évènement est déclenché au moment où le processus d'installation est engagé et non au moment où l'installation est terminée
window.addEventListener("appinstalled", () => {
On cache le l'encart de promotion de l'installation et on affiche le loader
pwaInstallPromotion.classList.remove('is-visible')
pwaInstallLoader.classList.add('is-visible')
L'événement étant déclenché au début de l'installation, on ne peut pas savoir à quel moment cette installation est terminée. On simule donc le temps de chargement en affichant le loader 2,5 secondes puis on affiche l'encart de confirmation de l'installation.
setTimeout(() => {
pwaInstallConfirm.classList.add('is-visible')
pwaInstallLoader.classList.remove('is-visible')
}, "2500");
On cache l'encart de promotion au click du bouton pwaPromotionClose
pwaInstallPromotionClose.addEventListener('click', (e) => {
pwaInstallPromotion.classList.remove('is-visible')
})
On cache l'encart de confirmation de l'installation au click du bouton pwaInstallConfirmClose
pwaInstallConfirmClose.addEventListener('click', (e) => {
pwaInstallConfirm.classList.remove('is-visible')
})
Voici l'appel de la fonction utilisé sur pwabunga.js
pwaInstall()
pwaInstall()
const pwaInstall = async () => {
const pwaInstallPromotion = document.querySelector('.pwa-install-promotion')
const pwaInstallPromotionClose = document.querySelector('.pwa-install-promotion-close')
const pwaInstallBtn = document.querySelector('.pwa-install-btn')
const pwaInstallConfirm = document.querySelector('.pwa-install-confirm')
const pwaInstallConfirmClose = document.querySelector('.pwa-install-confirm-close')
const pwaInstallLoader = document.querySelector('.pwa-loader')
let deferredPrompt
window.addEventListener('beforeinstallprompt', (e) => {
e.preventDefault()
deferredPrompt = e
pwaInstallPromotion.classList.add('is-visible')
pwaInstallBtn.classList.add('is-visible')
})
pwaInstallBtn.addEventListener('click', async () => {
deferredPrompt.prompt()
const { outcome } = await deferredPrompt.userChoice;
deferredPrompt = null
if (outcome === 'accepted') {
pwaInstallBtn.classList.remove('is-visible')
}
})
window.addEventListener("appinstalled", () => {
pwaInstallPromotion.classList.remove('is-visible')
pwaInstallLoader.classList.add('is-visible')
setTimeout(() => {
pwaInstallConfirm.classList.add('is-visible')
pwaInstallLoader.classList.remove('is-visible')
}, "2500");
})
pwaInstallPromotionClose.addEventListener('click', () => {
pwaInstallPromotion.classList.remove('is-visible')
})
pwaInstallConfirmClose.addEventListener('click', () => {
pwaInstallConfirm.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