16 lines
4.3 KiB
JavaScript
16 lines
4.3 KiB
JavaScript
let deferredInstallPrompt=null;
|
||
const banner=document.querySelector('[data-pwa-install]'),accept=banner?.querySelector('[data-pwa-accept]'),help=banner?.querySelector('[data-pwa-help]');
|
||
const standalone=matchMedia('(display-mode: standalone)').matches||navigator.standalone===true;
|
||
const mobileDevice=navigator.userAgentData?.mobile===true||/android|iphone|ipad|ipod|mobile/i.test(navigator.userAgent)||(matchMedia('(max-width: 820px)').matches&&matchMedia('(pointer: coarse)').matches);
|
||
const isiOS=/iphone|ipad|ipod/i.test(navigator.userAgent);
|
||
const dismissed=()=>Date.now()-Number(localStorage.getItem('pwa-install-dismissed')||0)<24*60*60*1000;
|
||
const show=()=>{if(banner&&mobileDevice&&!standalone&&!dismissed())banner.hidden=false};
|
||
const setGuide=(text,label='راهنمای نصب')=>{if(help)help.textContent=text;if(accept)accept.textContent=label;banner?.classList.add('pwa-install-guidance')};
|
||
if('serviceWorker' in navigator&&window.isSecureContext){let workerRegistration=null,workerReloading=false,hasWorkerController=Boolean(navigator.serviceWorker.controller);const assetVersion=document.documentElement.dataset.staticVersion||new URL(document.currentScript?.src||location.href).searchParams.get('v')||'';const serviceWorkerUrl=`/service-worker.js?v=${encodeURIComponent(assetVersion)}`;const updateWorker=()=>{if(workerRegistration&&document.visibilityState==='visible')workerRegistration.update().catch(()=>{})};navigator.serviceWorker.addEventListener('controllerchange',()=>{if(!hasWorkerController){hasWorkerController=true;return}if(workerReloading)return;workerReloading=true;location.reload()});window.addEventListener('load',async()=>{try{workerRegistration=await navigator.serviceWorker.register(serviceWorkerUrl,{updateViaCache:'none'});await workerRegistration.update()}catch(error){setGuide('فعالسازی نصب برنامه با خطا روبهرو شد. صفحه را تازهسازی کنید.');show()}});document.addEventListener('visibilitychange',updateWorker);setInterval(updateWorker,60000)}
|
||
window.addEventListener('beforeinstallprompt',event=>{event.preventDefault();deferredInstallPrompt=event;if(accept){accept.textContent='نصب برنامه';accept.disabled=false}banner?.classList.remove('pwa-install-guidance');if(help)help.textContent='برنامه آماده نصب است؛ برای ادامه روی «نصب برنامه» بزنید.';show()});
|
||
if(mobileDevice&&isiOS&&!standalone){setGuide('در Safari روی دکمه اشتراکگذاری (□↑) بزنید و «Add to Home Screen» را انتخاب کنید.','نمایش راهنما');setTimeout(show,700)}
|
||
if(mobileDevice&&!isiOS&&!standalone)setTimeout(()=>{if(!deferredInstallPrompt){setGuide(window.isSecureContext?'از منوی مرورگر گزینه «Install app» یا «افزودن به صفحه اصلی» را انتخاب کنید.':'نصب مستقیم روی آدرس HTTP شبکه ممکن نیست. سامانه را با HTTPS باز کنید؛ سپس دکمه نصب فعال میشود.','راهنمای نصب');show()}},1800);
|
||
banner?.querySelector('[data-pwa-dismiss]')?.addEventListener('click',()=>{banner.hidden=true;localStorage.setItem('pwa-install-dismissed',Date.now())});
|
||
accept?.addEventListener('click',async()=>{if(deferredInstallPrompt){accept.disabled=true;deferredInstallPrompt.prompt();const {outcome}=await deferredInstallPrompt.userChoice;deferredInstallPrompt=null;if(outcome==='accepted')banner.hidden=true;else{accept.disabled=false;setGuide('نصب لغو شد. برای تلاش دوباره از منوی مرورگر «Install app» را انتخاب کنید.')}}else if(isiOS){setGuide('۱) Safari را باز کنید. ۲) دکمه اشتراکگذاری □↑ را بزنید. ۳) Add to Home Screen و سپس Add را انتخاب کنید.','متوجه شدم')}else if(!window.isSecureContext){setGuide('مرورگر برای نصب و Service Worker به HTTPS نیاز دارد. از نسخه HTTPS سامانه استفاده کنید.','نیازمند HTTPS')}else{setGuide('منوی سهنقطه مرورگر را باز کنید و «Install app» یا «افزودن به صفحه اصلی» را بزنید.','نصب از منوی مرورگر')}});
|
||
window.addEventListener('appinstalled',()=>{deferredInstallPrompt=null;localStorage.removeItem('pwa-install-dismissed');if(banner)banner.hidden=true});
|