Додана сторінка "Стенд"
Додане повідомлення про оновлення застосунку Оновлен Service Worker Перероблен WebSocket APІ
This commit is contained in:
95
web/lib/components/cloud.js
Normal file
95
web/lib/components/cloud.js
Normal file
@@ -0,0 +1,95 @@
|
||||
const Cloud = {
|
||||
status: null,
|
||||
socket: null,
|
||||
reconnectTimeout: null,
|
||||
reconnectAttempts: 0,
|
||||
reconnecting: false,
|
||||
|
||||
start() {
|
||||
Cloud.status = 'sync';
|
||||
const uuid = localStorage.getItem("uuid");
|
||||
|
||||
if (Cloud.socket && Cloud.socket.readyState <= 1) return;
|
||||
|
||||
const ws = new WebSocket(CONFIG.wss, uuid);
|
||||
Cloud.socket = ws;
|
||||
|
||||
ws.onopen = () => {
|
||||
console.log("[WebSocket] З'єднання встановлено");
|
||||
Cloud.status = 'ok';
|
||||
ws.send(JSON.stringify({
|
||||
event: 'connection',
|
||||
user: {
|
||||
name: USER.name,
|
||||
id: USER.id
|
||||
}
|
||||
}));
|
||||
|
||||
if(Cloud.reconnecting == true) {
|
||||
Router.navigate(location.pathname);
|
||||
}
|
||||
|
||||
Cloud.reconnecting = true;
|
||||
Cloud.reconnectAttempts = 0;
|
||||
clearTimeout(Cloud.reconnectTimeout);
|
||||
};
|
||||
|
||||
ws.onmessage = (e) => {
|
||||
const data = JSON.parse(e.data);
|
||||
if (data.event === 'user_connected' && data.user.id !== USER.id) {
|
||||
console.log(`Новий користувач: ${data.user.name}`);
|
||||
}
|
||||
if (data.event === 'message') {
|
||||
switch (data.type) {
|
||||
case "apartment":
|
||||
Territory_card.cloud.update(data);
|
||||
break;
|
||||
|
||||
case "building":
|
||||
Territory_card.cloud.update(data);
|
||||
break;
|
||||
|
||||
case "stand_locking":
|
||||
case "stand_unlocking":
|
||||
case "stand_update":
|
||||
Stand_card.cloud.update(data);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
ws.onclose = () => {
|
||||
console.warn("[WebSocket] З'єднання розірвано");
|
||||
Cloud.status = 'err';
|
||||
|
||||
if (!Cloud.reconnecting) return; // защита от дублирования
|
||||
|
||||
if (Cloud.reconnectAttempts < 5) {
|
||||
Cloud.reconnectAttempts++;
|
||||
console.log(`[WebSocket] Спроба перепідключення ${Cloud.reconnectAttempts}/5`);
|
||||
|
||||
Cloud.reconnectTimeout = setTimeout(() => {
|
||||
Cloud.start();
|
||||
}, 1000);
|
||||
} else {
|
||||
Cloud.reconnecting = false;
|
||||
|
||||
if (confirm("З'єднання розірвано! Перепідключитись?")) {
|
||||
Cloud.reconnecting = true;
|
||||
Cloud.reconnectAttempts = 0;
|
||||
Cloud.start();
|
||||
} else {
|
||||
console.warn("[WebSocket] Перепідключення відмінено користувачем");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
ws.onerror = (err) => {
|
||||
console.error("[WebSocket] Помилка", err);
|
||||
Cloud.status = 'err';
|
||||
};
|
||||
},
|
||||
}
|
||||
@@ -31,4 +31,12 @@ function getTimeInSeconds(time = Date.now()) {
|
||||
}
|
||||
|
||||
return time;
|
||||
}
|
||||
|
||||
function formattedDayName(unix_timestamp) {
|
||||
const date = new Date(unix_timestamp);
|
||||
const daysOfWeekUA = ["Неділя", "Понеділок", "Вівторок", "Середа", "Четвер", "П'ятниця", "Субота"];
|
||||
const dayNameUA = daysOfWeekUA[date.getDay()];
|
||||
|
||||
return dayNameUA;
|
||||
}
|
||||
@@ -2,12 +2,12 @@
|
||||
const webPush = {
|
||||
async init() {
|
||||
if (!('serviceWorker' in navigator) || !('PushManager' in window)) {
|
||||
console.error('Push уведомления не поддерживаются');
|
||||
console.error('Push повідомлення не підтримуються');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// Получаем публичный ключ VAPID с сервера
|
||||
// Отримуємо публічний ключ VAPID із сервера
|
||||
const uuid = localStorage.getItem('uuid');
|
||||
const res = await fetch(`${CONFIG.api}push/key`, {
|
||||
method: 'GET',
|
||||
@@ -18,7 +18,7 @@ const webPush = {
|
||||
});
|
||||
const { publicKey } = await res.json();
|
||||
|
||||
// Преобразуем ключ
|
||||
// Перетворюємо ключ
|
||||
function urlBase64ToUint8Array(base64String) {
|
||||
const padding = '='.repeat((4 - (base64String.length % 4)) % 4);
|
||||
const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
|
||||
@@ -26,34 +26,34 @@ const webPush = {
|
||||
return Uint8Array.from([...raw].map(ch => ch.charCodeAt(0)));
|
||||
}
|
||||
|
||||
// Берем уже зарегистрированный Service Worker
|
||||
// Беремо вже зареєстрований Service Worker
|
||||
const registration = await navigator.serviceWorker.ready;
|
||||
|
||||
// Проверяем, есть ли уже подписка
|
||||
// Перевіряємо, чи є підписка
|
||||
let subscription = await registration.pushManager.getSubscription();
|
||||
|
||||
if (!subscription) {
|
||||
|
||||
// Запрашиваем разрешение
|
||||
// Запитуємо дозвіл
|
||||
const permission = await Notification.requestPermission();
|
||||
if (permission !== 'granted') {
|
||||
console.warn('Пуш уведомления запрещены пользователем');
|
||||
console.warn('Push повідомлення заборонено користувачем');
|
||||
return;
|
||||
}
|
||||
|
||||
// Подписка на push
|
||||
// Підписка на push
|
||||
subscription = await registration.pushManager.subscribe({
|
||||
userVisibleOnly: true,
|
||||
applicationServerKey: urlBase64ToUint8Array(publicKey)
|
||||
});
|
||||
|
||||
// данные устройства
|
||||
// дані пристроя
|
||||
const deviceInfo = {
|
||||
name: navigator.userAgent,
|
||||
model: navigator.platform || "unknown"
|
||||
};
|
||||
|
||||
// Отправка на сервер
|
||||
// Надсилання на сервер
|
||||
await fetch(`${CONFIG.api}push/subscribe`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
@@ -63,15 +63,15 @@ const webPush = {
|
||||
body: JSON.stringify({ subscription, device: deviceInfo })
|
||||
});
|
||||
|
||||
console.log('Push подписка готова:', subscription);
|
||||
console.log('Push підписка готова:', subscription);
|
||||
|
||||
console.log('Создана новая подписка');
|
||||
console.log('Створено нову підписку');
|
||||
} else {
|
||||
console.log('Подписка уже существует');
|
||||
console.log('Підписка вже існує');
|
||||
}
|
||||
|
||||
} catch (err) {
|
||||
console.error('Ошибка инициализации push:', err);
|
||||
console.error('Помилка ініціалізації push:', err);
|
||||
}
|
||||
},
|
||||
|
||||
@@ -81,13 +81,13 @@ const webPush = {
|
||||
const subscription = await registration.pushManager.getSubscription();
|
||||
|
||||
if (subscription) {
|
||||
// удаляем подписку в браузере
|
||||
// видаляємо підписку у браузері
|
||||
const success = await subscription.unsubscribe();
|
||||
|
||||
if (success) {
|
||||
console.log("Локальная подписка отменена");
|
||||
console.log("Локальна підписка скасована");
|
||||
|
||||
// уведомляем сервер
|
||||
// повідомляємо сервер
|
||||
await fetch(`${CONFIG.api}push//unsubscribe`, {
|
||||
method: "DELETE",
|
||||
headers: {
|
||||
@@ -98,7 +98,7 @@ const webPush = {
|
||||
});
|
||||
}
|
||||
} else {
|
||||
console.log("Подписки нет");
|
||||
console.log("Підписки немає");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user