@@ -114,6 +114,46 @@ export default function RootLayout({
114114 return (
115115 < html lang = "en" className = { `scroll-smooth ${ generalSans . variable } ` } >
116116 < head >
117+ < Script
118+ id = "hydration-recovery"
119+ strategy = "beforeInteractive"
120+ dangerouslySetInnerHTML = { {
121+ __html : `
122+ (function () {
123+ var recoveryKey = 'lap_hydration_recovery_v1';
124+ window.setTimeout(async function () {
125+ if (document.documentElement.dataset.lapHydrated === 'true') {
126+ try { window.sessionStorage.removeItem(recoveryKey); } catch (_) {}
127+ return;
128+ }
129+
130+ try {
131+ if (window.sessionStorage.getItem(recoveryKey)) return;
132+ window.sessionStorage.setItem(recoveryKey, '1');
133+
134+ if ('serviceWorker' in navigator) {
135+ var registrations = await navigator.serviceWorker.getRegistrations();
136+ await Promise.all(registrations.map(function (registration) {
137+ return registration.unregister();
138+ }));
139+ }
140+
141+ if ('caches' in window) {
142+ var cacheNames = await window.caches.keys();
143+ await Promise.all(cacheNames.map(function (cacheName) {
144+ return window.caches.delete(cacheName);
145+ }));
146+ }
147+
148+ window.location.reload();
149+ } catch (_) {
150+ // Leave the rendered page in place if browser storage is unavailable.
151+ }
152+ }, 8000);
153+ })();
154+ ` ,
155+ } }
156+ />
117157 { /* Google Analytics */ }
118158 { GA_TRACKING_ID && (
119159 < >
@@ -148,8 +188,9 @@ export default function RootLayout({
148188 __html : `
149189 if ('serviceWorker' in navigator) {
150190 window.addEventListener('load', function() {
151- navigator.serviceWorker.register('/sw.js' ).then(function(reg) {
191+ navigator.serviceWorker.register('/sw.js?v=3', { updateViaCache: 'none' } ).then(function(reg) {
152192 console.log('SW registered:', reg.scope);
193+ reg.update().catch(function() {});
153194 }).catch(function(err) {
154195 console.warn('SW registration failed:', err);
155196 });
0 commit comments