diff --git a/waiter_pwa/src/App.jsx b/waiter_pwa/src/App.jsx index 68b51b2..99d93a8 100644 --- a/waiter_pwa/src/App.jsx +++ b/waiter_pwa/src/App.jsx @@ -274,12 +274,31 @@ function AppLayout() { function AuthRehydrator() { const { token, user, login, logout } = useAuthStore() useEffect(() => { - if (token && !user) { - client.get('/api/auth/me') - .then(r => login(r.data, token)) - .catch(() => logout()) + if (!token || user) return + let cancelled = false + let timer = null + async function load() { + try { + const r = await client.get('/api/auth/me') + if (!cancelled) login(r.data, token) + } catch (err) { + if (cancelled) return + // Server unreachable (flaky WiFi, server restarting, IP change being + // rediscovered): keep the login and try again. Only a real answer from + // the server ends the session — 401 is also handled by the axios interceptor. + if (!err.response) { + timer = setTimeout(load, 5000) + return + } + logout() + } } - }, []) + load() + return () => { + cancelled = true + clearTimeout(timer) + } + }, [token, user]) return null }