handle all button types
This commit is contained in:
99
sw.js
99
sw.js
@@ -151,18 +151,95 @@ self.addEventListener('message', event => {
|
||||
self.addEventListener('push', event => {
|
||||
console.log('[ServiceWorker] Push received');
|
||||
|
||||
// const data = event.data ? event.data.json() : {};
|
||||
// const title = data.title || 'Game Timer Notification';
|
||||
// const options = {
|
||||
// body: data.body || 'You have a new notification',
|
||||
// icon: '/icons/android-chrome-192x192.png',
|
||||
// badge: '/icons/android-chrome-192x192.png',
|
||||
// data: data
|
||||
// };
|
||||
let pushData = {
|
||||
title: 'Flic Action',
|
||||
body: 'Button pressed!',
|
||||
data: { action: 'Unknown', button: 'Unknown' } // Default data
|
||||
};
|
||||
|
||||
// event.waitUntil(
|
||||
// self.registration.showNotification(title, options)
|
||||
// );
|
||||
// --- Attempt to parse data payload ---
|
||||
if (event.data) {
|
||||
try {
|
||||
const parsedData = event.data.json();
|
||||
console.log('[ServiceWorker] Push data:', parsedData);
|
||||
|
||||
// Use parsed data for notification and message
|
||||
pushData = {
|
||||
title: parsedData.title || pushData.title,
|
||||
body: parsedData.body || pushData.body,
|
||||
// IMPORTANT: Extract the action details sent from your backend
|
||||
data: parsedData.data || pushData.data // Expecting { action: 'SingleClick', button: '...' }
|
||||
};
|
||||
|
||||
} catch (e) {
|
||||
console.error('[ServiceWorker] Error parsing push data:', e);
|
||||
// Use default notification if parsing fails
|
||||
pushData.body = event.data.text() || pushData.body; // Fallback to text
|
||||
}
|
||||
} else {
|
||||
console.log('[ServiceWorker] Push event but no data');
|
||||
}
|
||||
|
||||
// --- Send message to client(s) ---
|
||||
const messagePayload = {
|
||||
type: 'flic-action', // Custom message type
|
||||
action: pushData.data.action, // e.g., 'SingleClick', 'DoubleClick', 'Hold'
|
||||
button: pushData.data.button // e.g., the button serial
|
||||
};
|
||||
|
||||
// Send message to all open PWA windows controlled by this SW
|
||||
event.waitUntil(
|
||||
self.clients.matchAll({
|
||||
type: 'window', // Only target window clients
|
||||
includeUncontrolled: true // Include clients that might not be fully controlled yet
|
||||
}).then(clientList => {
|
||||
if (!clientList || clientList.length === 0) {
|
||||
console.log('[ServiceWorker] No client windows found to send message to.');
|
||||
// If no window is open, we MUST show a notification
|
||||
return self.registration.showNotification(pushData.title, {
|
||||
body: pushData.body,
|
||||
icon: '/icons/icon-192x192.png', // Optional: path to an icon
|
||||
data: pushData.data // Pass data if needed when notification is clicked
|
||||
});
|
||||
}
|
||||
|
||||
// Post message to each client
|
||||
let messageSent = false;
|
||||
clientList.forEach(client => {
|
||||
console.log(`[ServiceWorker] Posting message to client: ${client.id}`, messagePayload);
|
||||
client.postMessage(messagePayload);
|
||||
messageSent = true; // Mark that we at least tried to send a message
|
||||
});
|
||||
|
||||
// Decide whether to still show a notification even if a window is open.
|
||||
// Generally good practice unless you are SURE the app will handle it visibly.
|
||||
// You might choose *not* to show a notification if a client was found and focused.
|
||||
// For simplicity here, we'll still show one. Adjust as needed.
|
||||
if (!messageSent) { // Only show notification if no message was sent? Or always show?
|
||||
return self.registration.showNotification(pushData.title, {
|
||||
body: pushData.body,
|
||||
icon: '/icons/icon-192x192.png',
|
||||
data: pushData.data
|
||||
});
|
||||
}
|
||||
})
|
||||
);
|
||||
|
||||
// --- Show a notification (Important!) ---
|
||||
// Push notifications generally REQUIRE showing a notification to the user
|
||||
// unless the PWA is already in the foreground AND handles the event visually.
|
||||
// It's safer to always show one unless you have complex foreground detection.
|
||||
/* This part is now handled inside the clients.matchAll promise */
|
||||
/*
|
||||
const notificationOptions = {
|
||||
body: pushData.body,
|
||||
icon: '/icons/icon-192x192.png', // Optional: path to an icon
|
||||
data: pushData.data // Attach data if needed when notification is clicked
|
||||
};
|
||||
event.waitUntil(
|
||||
self.registration.showNotification(pushData.title, notificationOptions)
|
||||
);
|
||||
*/
|
||||
});
|
||||
|
||||
// This helps with navigation after app is installed
|
||||
|
||||
Reference in New Issue
Block a user