WIP PWA for Grain
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: add service worker for PWA

+46
+37
public/sw.js
··· 1 + const CACHE_NAME = 'grain-shell-v1'; 2 + const SHELL_ASSETS = [ 3 + '/', 4 + '/index.html' 5 + ]; 6 + 7 + self.addEventListener('install', (event) => { 8 + event.waitUntil( 9 + caches.open(CACHE_NAME) 10 + .then((cache) => cache.addAll(SHELL_ASSETS)) 11 + .then(() => self.skipWaiting()) 12 + ); 13 + }); 14 + 15 + self.addEventListener('activate', (event) => { 16 + event.waitUntil( 17 + caches.keys().then((keys) => { 18 + return Promise.all( 19 + keys.filter((key) => key !== CACHE_NAME) 20 + .map((key) => caches.delete(key)) 21 + ); 22 + }).then(() => self.clients.claim()) 23 + ); 24 + }); 25 + 26 + self.addEventListener('fetch', (event) => { 27 + // Skip non-GET requests 28 + if (event.request.method !== 'GET') return; 29 + 30 + // Skip API requests (network-first) 31 + if (event.request.url.includes('/graphql')) return; 32 + 33 + event.respondWith( 34 + caches.match(event.request) 35 + .then((cached) => cached || fetch(event.request)) 36 + ); 37 + });
+9
src/main.js
··· 1 + // Register service worker 2 + if ('serviceWorker' in navigator) { 3 + navigator.serviceWorker.register('/sw.js') 4 + .then((reg) => console.log('SW registered:', reg.scope)) 5 + .catch((err) => console.error('SW registration failed:', err)); 6 + } 7 + 8 + // Import app shell 9 + import './components/pages/grain-app.js';