Files
2026-09-17 09:41:15 +03:30

16 lines
4.3 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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});