handle all button types

This commit is contained in:
cpu
2025-03-26 22:41:22 +01:00
parent 80989a248e
commit 429c1dd557
2 changed files with 165 additions and 30 deletions

99
sw.js
View File

@@ -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