fix: prevent infinite reload loop on stale build recovery

Use sessionStorage guard so the hard reload only fires once. If the
reload doesn't fix it (CDN still serving stale JS), fall through
gracefully instead of looping forever.
This commit is contained in:
Usman Baig
2026-03-07 19:55:16 +01:00
parent d2dfe62993
commit 6338d1dfe7
2 changed files with 28 additions and 5 deletions

View File

@@ -26,8 +26,15 @@ function AuthCallbackContent() {
try {
result = await exchangeAuthCode(code, codeVerifier, redirectUri)
} catch {
// * Stale build — cached JS has old Server Action hashes. Hard reload to fix.
window.location.reload()
// * Stale build — cached JS has old Server Action hashes. Hard reload once to fix.
const key = 'pulse_reload_for_stale_build'
if (!sessionStorage.getItem(key)) {
sessionStorage.setItem(key, '1')
window.location.reload()
return
}
sessionStorage.removeItem(key)
setError('Something went wrong. Please try logging in again.')
return
}
if (result.success && result.user) {

View File

@@ -135,10 +135,19 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
let session: Awaited<ReturnType<typeof getSessionAction>> = null
try {
session = await getSessionAction()
sessionStorage.removeItem('pulse_reload_for_stale_build')
} catch {
// * Stale build — browser has cached JS with old Server Action hashes.
// * Force a hard reload to fetch fresh bundles from the server.
window.location.reload()
// * Force a hard reload once to fetch fresh bundles. Guard prevents infinite loop.
const key = 'pulse_reload_for_stale_build'
if (!sessionStorage.getItem(key)) {
sessionStorage.setItem(key, '1')
window.location.reload()
return
}
sessionStorage.removeItem(key)
// * Reload didn't fix it — treat as no session
setLoading(false)
return
}
@@ -153,7 +162,14 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
try {
session = await getSessionAction()
} catch {
window.location.reload()
const key = 'pulse_reload_for_stale_build'
if (!sessionStorage.getItem(key)) {
sessionStorage.setItem(key, '1')
window.location.reload()
return
}
sessionStorage.removeItem(key)
setLoading(false)
return
}
}