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() {