136 lines
4.6 KiB
HTML
136 lines
4.6 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="ru">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, viewport-fit=cover, interactive-widget=resizes-content"/>
|
|
<meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)" />
|
|
<meta name="theme-color" content="#121212" media="(prefers-color-scheme: dark)" />
|
|
<title>Загрузка… — НаСвязи</title>
|
|
<link rel="stylesheet" href="/css/preloader.css" />
|
|
</head>
|
|
<body class="preloader">
|
|
<div id="loader">
|
|
<div id="offline-message" style="display: none;">
|
|
<h1>Нет подключения к интернету</h1>
|
|
<p>Проверьте подключение к сети или попробуйте ещё раз.</p>
|
|
<button id="retry-button">Попробовать снова</button>
|
|
</div>
|
|
<div class="spinner" style="display: none;"></div>
|
|
</div>
|
|
|
|
<script>
|
|
const offlineMessage = document.getElementById('offline-message');
|
|
const spinner = document.querySelector('.spinner');
|
|
const retryButton = document.getElementById('retry-button');
|
|
|
|
function setTitle(message) {
|
|
document.title = `${message} — НаСвязи`;
|
|
}
|
|
|
|
function showOfflineMessage() {
|
|
offlineMessage.style.display = 'block';
|
|
spinner.style.display = 'none';
|
|
setTitle('Проблемы с подключением');
|
|
}
|
|
|
|
function showLoadingMessage() {
|
|
offlineMessage.style.display = 'none';
|
|
spinner.style.display = 'block';
|
|
setTitle('Загрузка…');
|
|
}
|
|
|
|
async function retryConnection() {
|
|
showLoadingMessage();
|
|
|
|
try {
|
|
const response = await fetch('/', { method: 'HEAD' });
|
|
if (response.ok) {
|
|
location.reload(); // Перезагружаем страницу при успешном подключении
|
|
} else {
|
|
throw new Error('Сервер не отвечает');
|
|
}
|
|
} catch (error) {
|
|
console.error(error);
|
|
showOfflineMessage();
|
|
}
|
|
}
|
|
|
|
function handleOnlineStatus() {
|
|
location.reload(); // Перезагрузка при восстановлении сети
|
|
}
|
|
|
|
if ('serviceWorker' in navigator) {
|
|
// const registrationPromise = navigator.serviceWorker.ready ?? navigator.serviceWorker.register('/service-worker.js')
|
|
//
|
|
// registrationPromise.then(() => {
|
|
navigator.serviceWorker.controller.postMessage({ type: 'CHECK_MAIN_PAGE_READY' })
|
|
// })
|
|
|
|
navigator.serviceWorker.onmessage = (event) => {
|
|
console.log('onmessage', event.data && event.data.type);
|
|
if (event.data && event.data.type === 'MAIN_PAGE_READY') {
|
|
console.log('RELOAD!!!')
|
|
location.reload();
|
|
}
|
|
if (event.data && event.data.type === 'MAIN_PAGE_IS_NOT_READY') {
|
|
console.log('MAIN_PAGE_IS_NOT_READY');
|
|
}
|
|
|
|
if (event.data && event.data.type === 'NETWORK_ERROR') {
|
|
showOfflineMessage();
|
|
}
|
|
};
|
|
}
|
|
|
|
async function checkConnectionWithServiceWorker() {
|
|
if (!navigator.onLine) {
|
|
return false;
|
|
}
|
|
if ('serviceWorker' in navigator && navigator.serviceWorker.controller) {
|
|
return new Promise((resolve) => {
|
|
const messageChannel = new MessageChannel();
|
|
|
|
// Обрабатываем ответ от сервис-воркера
|
|
messageChannel.port1.onmessage = (event) => {
|
|
resolve(event.data.online);
|
|
console.log('resolve event.data.online', event.data.online);
|
|
};
|
|
|
|
// Посылаем сообщение в сервис-воркер
|
|
navigator.serviceWorker.controller.postMessage(
|
|
{ type: 'CHECK_ONLINE_STATUS' },
|
|
[messageChannel.port2]
|
|
);
|
|
});
|
|
} else {
|
|
// Если сервис-воркер недоступен, возвращаем состояние navigator.onLine
|
|
return navigator.onLine;
|
|
}
|
|
}
|
|
|
|
checkConnectionWithServiceWorker().then((isOnline) => {
|
|
if (!isOnline) showOfflineMessage();
|
|
});
|
|
|
|
|
|
retryButton.addEventListener('click', retryConnection);
|
|
window.addEventListener('online', handleOnlineStatus);
|
|
addEventListener("offline", showOfflineMessage);
|
|
|
|
showLoadingMessage();
|
|
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
if (!navigator.onLine) {
|
|
return;
|
|
}
|
|
if ('serviceWorker' in navigator && navigator.serviceWorker.controller) {
|
|
navigator.serviceWorker.controller.postMessage({ type: 'UPDATE_STATIC_ASSETS' });
|
|
console.log('Message sent to Service Worker: UPDATE_STATIC_ASSETS');
|
|
} else {
|
|
console.warn('Service Worker is not available or not controlling this page.');
|
|
}
|
|
});
|
|
</script>
|
|
</body>
|
|
</html>
|