fix(auth): resolve post-login navigate race condition and add version display (#68) (#70)

Root cause: when auth.me() failed during initial navigation, the catch block
called navigate('/login') without clearing _pendingLoginRedirect. The outer
finally then fired a second concurrent navigate('/login'), which held
isNavigating=true while running. If the user submitted the login form (or
iCloud Keychain autofilled credentials) before the second navigation
completed, navigate('/', user) was silently blocked by the isNavigating guard —
login appeared to succeed but the app never advanced to the dashboard.

Fix: clear _pendingLoginRedirect in the catch block so the finally handler
does not spawn the duplicate navigation.

Also adds a GET /api/v1/version endpoint (no auth required) and shows the
version on the login page, so users can verify their PWA has received the
latest cached JS.

Resolves #68

Co-authored-by: Ulas Kalayci <ulas.kalayci@googlemail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
ulsklyc
2026-04-21 08:19:53 +02:00
committed by GitHub
parent c1bdd4361d
commit d1ec7367a0
22 changed files with 711 additions and 657 deletions
+4
View File
@@ -171,6 +171,10 @@ async function navigate(path, userOrPushState = true, pushState = true) {
} catch {
currentPath = null; // Reset damit navigate('/login') nicht geblockt wird
isNavigating = false;
// _pendingLoginRedirect leeren: der catch ruft navigate('/login') direkt auf,
// der finally soll keinen zweiten Aufruf starten (würde isNavigating=true setzen,
// während die Login-Seite rendert, und so post-login navigate blockieren).
_pendingLoginRedirect = false;
navigate('/login');
return;
}