Skip to content

Commit 7f6a80c

Browse files
committed
fix: update service worker when navigating
1 parent 0086d2a commit 7f6a80c

File tree

3 files changed

+66
-37
lines changed

3 files changed

+66
-37
lines changed

.github/workflows/bundle-analysis.yml

+11
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,14 @@ jobs:
5353
NEXTAUTH_URL: ${{ secrets.NEXTAUTH_URL }}
5454
NEXT_PUBLIC_APP_URL: ${{ secrets.NEXT_PUBLIC_APP_URL }}
5555
SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
56+
PRIVATE_VAPID: ${{ secrets.PRIVATE_VAPID }}
57+
EMAIL_API_KEY: ${{ secrets.EMAIL_API_KEY }}
58+
STRIPE_SECRET_KEY: ${{ secrets.STRIPE_SECRET_KEY }}
59+
STRIPE_SIGN_SECRET: ${{ secrets.STRIPE_SIGN_SECRET }}
60+
SW_CACHE_ID: ${{ secrets.SW_CACHE_ID }}
61+
QSTASH_NEXT_SIGNING_KEY: ${{ secrets.QSTASH_NEXT_SIGNING_KEY }}
62+
QSTASH_CURRENT_SIGNING_KEY: ${{ secrets.QSTASH_CURRENT_SIGNING_KEY }}
63+
TINYBIRD_ADMIN_TOKEN: ${{ secrets.TINYBIRD_ADMIN_TOKEN }}
64+
CRON_SECRET: ${{ secrets.CRON_SECRET }}
65+
NEXT_PUBLIC_VAPID: ${{ secrets.NEXT_PUBLIC_VAPID }}
66+
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: ${{ secrets.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY }}

.github/workflows/release.yml

+11
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,14 @@ jobs:
6161
NEXTAUTH_URL: ${{ secrets.NEXTAUTH_URL }}
6262
NEXT_PUBLIC_APP_URL: ${{ secrets.NEXT_PUBLIC_APP_URL }}
6363
SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
64+
PRIVATE_VAPID: ${{ secrets.PRIVATE_VAPID }}
65+
EMAIL_API_KEY: ${{ secrets.EMAIL_API_KEY }}
66+
STRIPE_SECRET_KEY: ${{ secrets.STRIPE_SECRET_KEY }}
67+
STRIPE_SIGN_SECRET: ${{ secrets.STRIPE_SIGN_SECRET }}
68+
SW_CACHE_ID: ${{ secrets.SW_CACHE_ID }}
69+
QSTASH_NEXT_SIGNING_KEY: ${{ secrets.QSTASH_NEXT_SIGNING_KEY }}
70+
QSTASH_CURRENT_SIGNING_KEY: ${{ secrets.QSTASH_CURRENT_SIGNING_KEY }}
71+
TINYBIRD_ADMIN_TOKEN: ${{ secrets.TINYBIRD_ADMIN_TOKEN }}
72+
CRON_SECRET: ${{ secrets.CRON_SECRET }}
73+
NEXT_PUBLIC_VAPID: ${{ secrets.NEXT_PUBLIC_VAPID }}
74+
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: ${{ secrets.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY }}

packages/ui/src/contexts/notification-context/use-reload-when-sw-change.ts

+44-37
Original file line numberDiff line numberDiff line change
@@ -27,52 +27,59 @@ export function useReloadWhenSwChange() {
2727
}
2828

2929
navigator.serviceWorker.register('/sw.js').then((registration) => {
30-
// Track updates to the Service Worker.
3130
if (!navigator.serviceWorker.controller) {
32-
// The window client isn't currently controlled so it's a new service
33-
// worker that will activate immediately
3431
return;
3532
}
3633
registration.update();
3734

38-
handleNewServiceWorker(registration, () => {
39-
if (!registration.waiting) {
40-
// Just to ensure registration.waiting is available before
41-
// calling postMessage()
42-
return;
35+
// Handle both page refresh/close and SPA navigation
36+
const skipWaitingOnNavigation = () => {
37+
if (registration.waiting) {
38+
logger.debug('Activating new service worker on navigation');
39+
registration.waiting.postMessage('skipWaiting');
4340
}
41+
};
4442

45-
registration.waiting.postMessage('skipWaiting');
46-
});
47-
});
48-
}, []);
49-
}
43+
// Listen for regular page unload
44+
window.addEventListener('beforeunload', skipWaitingOnNavigation);
5045

51-
function handleNewServiceWorker(
52-
registration: ServiceWorkerRegistration,
53-
callback: () => void,
54-
) {
55-
if (registration.waiting) {
56-
// SW is waiting to activate. Can occur if multiple clients open and
57-
// one of the clients is refreshed.
58-
return callback();
59-
}
46+
// Listen for SPA navigation
47+
window.addEventListener('popstate', skipWaitingOnNavigation);
48+
const originalPushState = history.pushState.bind(history);
49+
const originalReplaceState = history.replaceState.bind(history);
6050

61-
function listenInstalledStateChange() {
62-
registration.installing?.addEventListener('statechange', (event: Event) => {
63-
// @ts-ignore
64-
if (event.target?.state === 'installed') {
65-
// A new service worker is available, inform the user
66-
callback();
67-
}
68-
});
69-
}
51+
history.pushState = (...args) => {
52+
originalPushState(...args);
53+
skipWaitingOnNavigation();
54+
};
55+
56+
history.replaceState = (...args) => {
57+
originalReplaceState(...args);
58+
skipWaitingOnNavigation();
59+
};
7060

71-
if (registration.installing) {
72-
return listenInstalledStateChange();
73-
}
61+
registration.addEventListener('updatefound', () => {
62+
registration.installing?.addEventListener(
63+
'statechange',
64+
(event: Event) => {
65+
// @ts-ignore
66+
if (event.target?.state === 'installed' && registration.waiting) {
67+
// Will activate on next navigation
68+
logger.debug(
69+
'New service worker installed, waiting for navigation',
70+
);
71+
}
72+
},
73+
);
74+
});
7475

75-
// We are currently controlled so a new SW may be found...
76-
// Add a listener in case a new SW is found,
77-
registration.addEventListener('updatefound', listenInstalledStateChange);
76+
// Cleanup
77+
return () => {
78+
window.removeEventListener('beforeunload', skipWaitingOnNavigation);
79+
window.removeEventListener('popstate', skipWaitingOnNavigation);
80+
history.pushState = originalPushState;
81+
history.replaceState = originalReplaceState;
82+
};
83+
});
84+
}, []);
7885
}

0 commit comments

Comments
 (0)