diff --git a/.env.example b/.env.example index 3ee8dfa..585e4c7 100644 --- a/.env.example +++ b/.env.example @@ -110,6 +110,11 @@ LOG_LEVEL=INFO # Container-Timeout in Sekunden (fuer Auto-Shutdown, noch nicht implementiert) CONTAINER_IDLE_TIMEOUT=3600 +# Container-Erstellungs-Timeout in Sekunden +# Wie lange wartet das Frontend beim Verifizieren auf erfolgreichen Container-Spawn? +# (Standard: 10 Sekunden, dann Error-Message zeigen) +CONTAINER_CREATE_TIMEOUT=10 + # ============================================================ # PASSWORDLESS AUTH - Magic Links # ============================================================ diff --git a/frontend/src/app/verify-login/page.tsx b/frontend/src/app/verify-login/page.tsx index 6e33878..6353ca0 100644 --- a/frontend/src/app/verify-login/page.tsx +++ b/frontend/src/app/verify-login/page.tsx @@ -32,18 +32,43 @@ function VerifyLoginContent() { } const verify = async () => { - const result = await verifyLogin(token); + const maxRetries = 5; + const retryDelay = 2000; // 2 Sekunden + const maxTimeout = 10000; // 10 Sekunden Gesamtzeit - if (result.success) { - setStatus("success"); - // Redirect nach 1 Sekunde zum Dashboard - setTimeout(() => { - router.push("/dashboard"); - }, 1000); - } else { - setStatus("error"); - setError("Ungültiger oder abgelaufener Link"); + let attempt = 0; + const startTime = Date.now(); + + while (attempt < maxRetries) { + // Prüfe ob Timeout überschritten + if (Date.now() - startTime > maxTimeout) { + setStatus("error"); + setError("Login hat zu lange gedauert. Bitte versuche es später erneut."); + return; + } + + const result = await verifyLogin(token); + + if (result.success) { + setStatus("success"); + // Redirect nach 1 Sekunde zum Dashboard + setTimeout(() => { + router.push("/dashboard"); + }, 1000); + return; + } + + // Fehler - Versuche erneut (außer beim letzten Versuch) + attempt++; + if (attempt < maxRetries) { + // Warte vor nächstem Versuch + await new Promise(resolve => setTimeout(resolve, retryDelay)); + } } + + // Alle Versuche fehlgeschlagen + setStatus("error"); + setError("Login fehlgeschlagen. Bitte versuche den Link erneut anzufordern."); }; verify(); diff --git a/frontend/src/app/verify-signup/page.tsx b/frontend/src/app/verify-signup/page.tsx index da4311d..9cab25f 100644 --- a/frontend/src/app/verify-signup/page.tsx +++ b/frontend/src/app/verify-signup/page.tsx @@ -32,18 +32,43 @@ function VerifySignupContent() { } const verify = async () => { - const result = await verifySignup(token); + const maxRetries = 5; + const retryDelay = 2000; // 2 Sekunden + const maxTimeout = 10000; // 10 Sekunden Gesamtzeit - if (result.success) { - setStatus("success"); - // Redirect nach 2 Sekunden zum Dashboard - setTimeout(() => { - router.push("/dashboard"); - }, 2000); - } else { - setStatus("error"); - setError("Ungültiger oder abgelaufener Link"); + let attempt = 0; + const startTime = Date.now(); + + while (attempt < maxRetries) { + // Prüfe ob Timeout überschritten + if (Date.now() - startTime > maxTimeout) { + setStatus("error"); + setError("Verifizierung hat zu lange gedauert. Bitte versuche es später erneut."); + return; + } + + const result = await verifySignup(token); + + if (result.success) { + setStatus("success"); + // Redirect nach 2 Sekunden zum Dashboard + setTimeout(() => { + router.push("/dashboard"); + }, 2000); + return; + } + + // Fehler - Versuche erneut (außer beim letzten Versuch) + attempt++; + if (attempt < maxRetries) { + // Warte vor nächstem Versuch + await new Promise(resolve => setTimeout(resolve, retryDelay)); + } } + + // Alle Versuche fehlgeschlagen + setStatus("error"); + setError("Verifizierung fehlgeschlagen. Bitte versuche den Link erneut anzufordern."); }; verify();