diff --git a/LittleShop/wwwroot/js/pwa.js b/LittleShop/wwwroot/js/pwa.js index f87fc48..5b182bb 100644 --- a/LittleShop/wwwroot/js/pwa.js +++ b/LittleShop/wwwroot/js/pwa.js @@ -262,10 +262,17 @@ class PWAManager { // Simple logic: only show prompt if user is not subscribed if (!this.pushSubscription) { - // Check if we've already asked this session - if (!sessionStorage.getItem('pushNotificationPromptShown')) { + // Check if we've already asked this session or user declined + const promptShown = sessionStorage.getItem('pushNotificationPromptShown'); + const userDeclined = localStorage.getItem('pushNotificationDeclined'); + + if (!promptShown && !userDeclined) { this.showPushNotificationSetup(); sessionStorage.setItem('pushNotificationPromptShown', 'true'); + } else if (promptShown) { + console.log('PWA: Push notification prompt already shown this session'); + } else if (userDeclined) { + console.log('PWA: User previously declined push notifications'); } } else { console.log('PWA: User already subscribed to push notifications'); @@ -454,6 +461,7 @@ class PWAManager {
+
@@ -463,33 +471,38 @@ class PWAManager { // Add event listener for subscribe button const subscribeBtn = document.getElementById('subscribe-push-btn'); + const skipBtn = document.getElementById('skip-push-btn'); if (subscribeBtn) { subscribeBtn.addEventListener('click', async () => { subscribeBtn.disabled = true; + skipBtn.disabled = true; subscribeBtn.innerHTML = 'Subscribing...'; - + try { // Add timeout to prevent infinite hanging const subscriptionPromise = this.subscribeToPushNotifications(); - const timeoutPromise = new Promise((_, reject) => - setTimeout(() => reject(new Error('Push subscription timed out after 15 seconds. This may be due to network connectivity or browser push service issues.')), 15000) + const timeoutPromise = new Promise((_, reject) => + setTimeout(() => reject(new Error('Push subscription timed out after 15 seconds. This may be due to Chrome\'s Firebase Cloud Messaging (FCM) service connectivity issues. This can happen with corporate firewalls or VPNs.')), 15000) ); - + await Promise.race([subscriptionPromise, timeoutPromise]); - + this.showNotification('Push notifications enabled!', { body: 'You will now receive notifications for new orders and updates.' }); } catch (error) { console.error('PWA: Push subscription failed:', error); - - // Provide user-friendly error messages + + // Provide user-friendly error messages with specific guidance let userMessage = error.message; + let showAdvice = false; + if (error.message.includes('permission')) { userMessage = 'Please allow notifications when your browser asks, then try again.'; - } else if (error.message.includes('timeout')) { - userMessage = 'Push notification setup timed out. This may be due to network or browser push service issues. Please check your internet connection and try again.'; + } else if (error.message.includes('timeout') || error.message.includes('FCM')) { + userMessage = 'Chrome\'s push notification service is not responding. This is often caused by:\n\n• Corporate firewall blocking Google FCM\n• VPN interference\n• Network connectivity issues\n\nYou can try again later or use the browser without push notifications.'; + showAdvice = true; } else if (error.message.includes('push service')) { userMessage = 'Failed to connect to browser push service. This may be a temporary network issue. Please try again in a few moments.'; } else if (error.message.includes('AbortError')) { @@ -497,12 +510,31 @@ class PWAManager { } console.error('PWA: Full error details:', error); - alert('Failed to enable push notifications: ' + userMessage); + + if (showAdvice) { + if (confirm(userMessage + '\n\nWould you like to skip push notifications for now?')) { + localStorage.setItem('pushNotificationDeclined', 'true'); + this.hidePushNotificationSetup(); + return; + } + } else { + alert('Failed to enable push notifications: ' + userMessage); + } + subscribeBtn.disabled = false; + skipBtn.disabled = false; subscribeBtn.innerHTML = 'Enable'; } }); } + + if (skipBtn) { + skipBtn.addEventListener('click', () => { + console.log('PWA: User skipped push notifications'); + localStorage.setItem('pushNotificationDeclined', 'true'); + this.hidePushNotificationSetup(); + }); + } } hidePushNotificationSetup() {