Додане повідомлення про оновлення застосунку Оновлен Service Worker Перероблен WebSocket APІ
217 lines
7.4 KiB
JavaScript
217 lines
7.4 KiB
JavaScript
let USER = {};
|
|
let swRegistration = null;
|
|
|
|
// Определение ID главного блока
|
|
let app = document.getElementById('app');
|
|
|
|
// Конфигурация роутера
|
|
Router.config({ mode: 'history' });
|
|
|
|
async function appReload() {
|
|
|
|
location.reload();
|
|
|
|
// Router.navigate(window.location.pathname, false).check();
|
|
|
|
// // Закрытие старого соединения WebSocket
|
|
// if (socket) socket.close(1000, "Перезапуск соединения");
|
|
// listEntrances = []
|
|
// listApartment = []
|
|
}
|
|
|
|
// Функция загрузки приложения
|
|
window.addEventListener('load', async function () {
|
|
console.log('[OS] ', detectOS());
|
|
if (window.matchMedia('(display-mode: standalone)').matches) {
|
|
if (detectOS() == 'Android') {
|
|
document.getElementById('navigation').dataset.state = '';
|
|
} else if (detectOS() == 'iOS') {
|
|
document.getElementById('navigation').dataset.state = 'ios';
|
|
localStorage.setItem('backToTop', 'false');
|
|
} else if (detectOS() == 'MacOS') {
|
|
document.getElementById('navigation').dataset.state = 'ios';
|
|
localStorage.setItem('backToTop', 'false');
|
|
} else {
|
|
document.getElementById('navigation').dataset.state = '';
|
|
}
|
|
}
|
|
|
|
if (Router.getParams().uuid) {
|
|
localStorage.setItem("uuid", Router.getParams().uuid)
|
|
}
|
|
|
|
let uuid = localStorage.getItem("uuid");
|
|
if (!uuid) {
|
|
Router.navigate(`/auth`).check().listen().delegateLinks();
|
|
} else {
|
|
const URL = `${CONFIG.api}auth`;
|
|
USER = await fetch(URL, {
|
|
method: 'GET',
|
|
headers: {
|
|
"Content-Type": "application/json, text/plain, */*",
|
|
"Authorization": uuid
|
|
}
|
|
}).then(response => {
|
|
if (response.status === 401) {
|
|
localStorage.removeItem("uuid");
|
|
Router.navigate(`/auth`);
|
|
}
|
|
return response.json();
|
|
});
|
|
|
|
console.log("USER Info: ", USER);
|
|
|
|
|
|
if (USER.possibilities.can_view_sheeps) document.getElementById("li-sheeps").style.display = "";
|
|
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();
|
|
}
|
|
});
|
|
|
|
function editFontStyle() {
|
|
let fontSize = localStorage.getItem("fontSize")
|
|
? localStorage.getItem("fontSize")
|
|
: 'medium';
|
|
|
|
applyFontMode(fontSize);
|
|
}
|
|
|
|
function applyFontMode(mode) {
|
|
const options = {
|
|
"small": {
|
|
"--FontSize1": "10px",
|
|
"--FontSize2": "11px",
|
|
"--FontSize3": "12px",
|
|
"--FontSize4": "13px",
|
|
"--FontSize5": "14px"
|
|
},
|
|
"medium": {
|
|
"--FontSize1": "12px",
|
|
"--FontSize2": "13px",
|
|
"--FontSize3": "14px",
|
|
"--FontSize4": "15px",
|
|
"--FontSize5": "16px"
|
|
},
|
|
"large": {
|
|
"--FontSize1": "15px",
|
|
"--FontSize2": "16px",
|
|
"--FontSize3": "17px",
|
|
"--FontSize4": "18px",
|
|
"--FontSize5": "19px"
|
|
}
|
|
};
|
|
|
|
const root = document.documentElement;
|
|
const config = options[mode];
|
|
|
|
if (!config) return;
|
|
|
|
Object.keys(config).forEach(key => {
|
|
if (key.startsWith("--")) {
|
|
root.style.setProperty(key, config[key]);
|
|
}
|
|
});
|
|
}
|
|
|
|
|
|
// Банер з прохання встановлення PWA
|
|
let deferredPrompt;
|
|
const isInStandaloneMode = () =>
|
|
('standalone' in window.navigator && window.navigator.standalone === true);
|
|
|
|
if (detectOS() == 'iOS' && !isInStandaloneMode()) {
|
|
setTimeout(() => {
|
|
document.getElementById('blur-backdrop').classList.remove('pwa-hidden');
|
|
document.getElementById('pwa-ios-overlay').classList.remove('pwa-hidden');
|
|
document.body.classList.add('modal-open');
|
|
}, 1000);
|
|
}
|
|
|
|
window.addEventListener("beforeinstallprompt", (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");
|
|
}
|
|
});
|
|
document.getElementById("pwa-install-button").addEventListener("click", async () => {
|
|
if (!deferredPrompt) return;
|
|
|
|
deferredPrompt.prompt();
|
|
const { outcome } = await deferredPrompt.userChoice;
|
|
console.log(`Результат встановлення PWA: ${outcome}`);
|
|
|
|
closePopup();
|
|
});
|
|
document.getElementById("pwa-close-button").addEventListener("click", closePopup);
|
|
document.getElementById('pwa-ios-close-button').addEventListener('click', closePopup);
|
|
|
|
function closePopup() {
|
|
document.getElementById("pwa-install-overlay").classList.add("pwa-hidden");
|
|
document.getElementById("blur-backdrop").classList.add("pwa-hidden");
|
|
document.getElementById('pwa-ios-overlay').classList.add('pwa-hidden');
|
|
document.body.classList.remove("modal-open");
|
|
deferredPrompt = null;
|
|
}
|
|
|
|
|
|
|
|
if ('serviceWorker' in navigator) {
|
|
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));
|
|
} |