From 37986f8b0b6ebc603129761bf04b0f9967114137 Mon Sep 17 00:00:00 2001 From: pavel Date: Thu, 12 Feb 2026 01:51:39 +0100 Subject: [PATCH] puush --- frontend/src/main.js | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/frontend/src/main.js b/frontend/src/main.js index 1af24b6..8fe9419 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -19,7 +19,8 @@ const state = { isEditing: false, isAuthenticated: false, chatMessages: [], - activeDashboardTab: 'chat' // 'chat' or 'activity' + activeDashboardTab: 'chat', // 'chat' or 'activity' + swRegistration: null }; // DOM elements const loginOverlay = document.getElementById('login-overlay'); @@ -825,7 +826,7 @@ if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js') .then(reg => { console.log('SW registered', reg); - setupPush(reg); + state.swRegistration = reg; }) .catch(err => { console.error('SW registration failed:', err); @@ -836,12 +837,17 @@ if ('serviceWorker' in navigator) { }); } -async function setupPush(registration) { +async function setupPush() { + if (!state.swRegistration) { + console.warn('SW registration not available'); + return false; + } + try { const vapidResponse = await fetch(`${API_URL}/notifications/vapid-key`); const { publicKey } = await vapidResponse.json(); - const subscription = await registration.pushManager.subscribe({ + const subscription = await state.swRegistration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: urlBase64ToUint8Array(publicKey) }); @@ -856,8 +862,10 @@ async function setupPush(registration) { }) }); console.log('Push registered'); + return true; } catch (err) { console.warn('Push registration failed:', err); + return false; } } @@ -881,6 +889,26 @@ async function toggleTaskSubscription(taskId) { const isNotified = btn.classList.contains('notified'); const method = isNotified ? 'DELETE' : 'POST'; + // If trying to enable but no push subscription, try setting it up first (user gesture here) + if (!isNotified && 'Notification' in window) { + if (Notification.permission !== 'granted') { + const permission = await Notification.requestPermission(); + if (permission !== 'granted') { + showToast('Notification permission denied', 'error'); + return; + } + } + + const sub = await state.swRegistration.pushManager.getSubscription(); + if (!sub) { + const success = await setupPush(); + if (!success) { + showToast('Failed to initialize push notifications', 'error'); + return; + } + } + } + try { await fetch(`${API_URL}/tasks/${taskId}/subscribe`, { method }); btn.classList.toggle('notified');