From ed72b9813020e4d086139ba7982adb5cab5845db Mon Sep 17 00:00:00 2001 From: Eros Taborelli Date: Tue, 18 Nov 2025 15:53:03 +0100 Subject: [PATCH 1/2] fix(pwa): Fix PWA by providing correct icons and service worker for offline use --- public/manifest.json | 24 +++++++++++++----- public/sw.js | 60 ++++++++++++++++++++++++++++++++++++++++++++ src/main.js | 16 ++++++++++++ 3 files changed, 94 insertions(+), 6 deletions(-) create mode 100644 public/sw.js diff --git a/public/manifest.json b/public/manifest.json index 9962870..448ffe8 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -9,41 +9,53 @@ "orientation": "any", "icons": [ { - "purpose": "maskable", + "purpose": "any", "sizes": "48x48", "src": "/icons/maskable_icon_x48.png", "type": "image/png" }, { - "purpose": "maskable", + "purpose": "any", "sizes": "72x72", "src": "/icons/maskable_icon_x72.png", "type": "image/png" }, { - "purpose": "maskable", + "purpose": "any", "sizes": "96x96", "src": "/icons/maskable_icon_x96.png", "type": "image/png" }, { - "purpose": "maskable", + "purpose": "any", "sizes": "128x128", "src": "/icons/maskable_icon_x128.png", "type": "image/png" }, { - "purpose": "maskable", + "purpose": "any", "sizes": "192x192", "src": "/icons/maskable_icon_x192.png", "type": "image/png" }, { - "purpose": "maskable", + "purpose": "any", "sizes": "384x384", "src": "/icons/maskable_icon_x384.png", "type": "image/png" }, + { + "purpose": "any", + "sizes": "512x512", + "src": "/icons/maskable_icon_x512.png", + "type": "image/png" + }, + { + "purpose": "maskable", + "sizes": "192x192", + "src": "/icons/maskable_icon_x192.png", + "type": "image/png" + }, { "purpose": "maskable", "sizes": "512x512", diff --git a/public/sw.js b/public/sw.js new file mode 100644 index 0000000..3fa0429 --- /dev/null +++ b/public/sw.js @@ -0,0 +1,60 @@ +/** + * Minimal Service Worker for PWA installability + * This is required for the app to be installable as a PWA + */ + +const CACHE_NAME = 'framed-v1'; + +/** + * Install event - cache essential resources + */ +self.addEventListener('install', (event) => { + event.waitUntil( + caches.open(CACHE_NAME).then((cache) => { + return cache.addAll([ + '/', + '/index.html' + ]); + }) + ); + self.skipWaiting(); +}); + +/** + * Activate event - clean up old caches + */ +self.addEventListener('activate', (event) => { + event.waitUntil( + caches.keys().then((cacheNames) => { + return Promise.all( + cacheNames + .filter((name) => name !== CACHE_NAME) + .map((name) => caches.delete(name)) + ); + }) + ); + self.clients.claim(); +}); + +/** + * Fetch event - network first, fallback to cache + */ +self.addEventListener('fetch', (event) => { + event.respondWith( + fetch(event.request) + .then((response) => { + // Clone and cache successful responses + if (response.status === 200) { + const responseClone = response.clone(); + caches.open(CACHE_NAME).then((cache) => { + cache.put(event.request, responseClone); + }); + } + return response; + }) + .catch(() => { + // If network fails, try cache + return caches.match(event.request); + }) + ); +}); diff --git a/src/main.js b/src/main.js index 84fa500..9c32d0a 100644 --- a/src/main.js +++ b/src/main.js @@ -10,3 +10,19 @@ import './assets/styles/main.css'; const app = createApp(App); app.use(VueKonva); app.mount('#app'); + +/** + * Register service worker for PWA support + */ +if ('serviceWorker' in navigator) { + window.addEventListener('load', () => { + navigator.serviceWorker + .register('/sw.js') + .then((registration) => { + console.log('Service Worker registered:', registration.scope); + }) + .catch((error) => { + console.log('Service Worker registration failed:', error); + }); + }); +} From eaa0c6c2cc845f87080a6f19eb0f6fa936d57e72 Mon Sep 17 00:00:00 2001 From: Eros Taborelli Date: Tue, 18 Nov 2025 16:01:24 +0100 Subject: [PATCH 2/2] fix(pwa): Remove wrong console statement --- src/main.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main.js b/src/main.js index 9c32d0a..37be519 100644 --- a/src/main.js +++ b/src/main.js @@ -18,11 +18,8 @@ if ('serviceWorker' in navigator) { window.addEventListener('load', () => { navigator.serviceWorker .register('/sw.js') - .then((registration) => { - console.log('Service Worker registered:', registration.scope); - }) .catch((error) => { - console.log('Service Worker registration failed:', error); + console.error('Service Worker registration failed:', error); }); }); }