Додана сторінка "Стенд"

Додане повідомлення про оновлення застосунку
Оновлен Service Worker
Перероблен WebSocket APІ
This commit is contained in:
2025-10-19 00:55:30 +03:00
parent 6ec6523d71
commit 3f08f3f6c9
46 changed files with 2651 additions and 2691 deletions

View File

@@ -1,4 +1,5 @@
let USER = {};
let swRegistration = null;
// Определение ID главного блока
let app = document.getElementById('app');
@@ -65,12 +66,16 @@ window.addEventListener('load', async function () {
if (USER.possibilities.can_view_schedule) document.getElementById("li-schedule").style.display = "";
if (USER.possibilities.can_manager_territory) document.getElementById("li-territory").style.display = "";
if (USER.possibilities.can_view_stand) document.getElementById("li-stand").style.display = "";
document.getElementById("li-options").style.display = "";
if (USER.possibilities.can_view_sheeps) await Sheeps.sheeps_list.loadAPI();
editFontStyle();
Router.check().listen().delegateLinks();
if (Cloud.socket) Cloud.socket.close(1000, "Перезапуск з'єднання");
Cloud.start();
}
});
@@ -134,10 +139,10 @@ if (detectOS() == 'iOS' && !isInStandaloneMode()) {
}
window.addEventListener("beforeinstallprompt", (e) => {
e.preventDefault();
deferredPrompt = e;
if (localStorage.getItem('modal') != "false") {
e.preventDefault();
deferredPrompt = e;
document.getElementById("blur-backdrop").classList.remove("pwa-hidden");
document.getElementById("pwa-install-overlay").classList.remove("pwa-hidden");
document.body.classList.add("modal-open");
@@ -148,7 +153,7 @@ document.getElementById("pwa-install-button").addEventListener("click", async ()
deferredPrompt.prompt();
const { outcome } = await deferredPrompt.userChoice;
console.log(`PWA install result: ${outcome}`);
console.log(`Результат встановлення PWA: ${outcome}`);
closePopup();
});
@@ -166,10 +171,47 @@ function closePopup() {
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('sw.js')
.then(() => {
console.log('Service Worker зарегистрирован');
webPush.init();
})
.catch(err => console.error('Ошибка регистрации SW:', err));
let refreshing = false;
const showUpdateBanner = sw => {
const banner = document.getElementById('update_banner');
if (!banner) return;
banner.dataset.state = 'updateavailable';
banner.querySelector('.headline').textContent = 'Доступне оновлення';
banner.querySelector('.subhead').textContent = 'Натисніть, щоб оновити додаток до останньої версії!';
banner.addEventListener('click', () => {
banner.querySelector('.headline').textContent = '';
banner.querySelector('.subhead').textContent = '';
banner.querySelector('#update_banner_icon').style.display = 'block';
sw.postMessage('skipWaiting'); // активує новий SW
sw.postMessage('updateCache'); // оновлює кеш
});
};
navigator.serviceWorker.register('/sw.js').then(reg => {
// якщо є waiting SW, показуємо банер
if (reg.waiting) showUpdateBanner(reg.waiting);
// слідкуємо за новим воркером
reg.addEventListener('updatefound', () => {
const newWorker = reg.installing;
if (!newWorker) return;
newWorker.addEventListener('statechange', () => {
if (newWorker.state === 'installed' && reg.waiting) {
showUpdateBanner(reg.waiting); // лише показ банера
}
});
});
navigator.serviceWorker.addEventListener('controllerchange', () => {
if (refreshing) return;
refreshing = true;
window.location.reload(); // відбувається ТІЛЬКИ після skipWaiting
});
}).catch(err => console.error('Помилка реєстрації SW:', err));
}