This commit is contained in:
2026-05-28 18:58:38 +02:00
parent 641bb10479
commit 28f429885a
4950 changed files with 933414 additions and 666 deletions

View File

@@ -3588,8 +3588,13 @@ async function doLogin() {
errEl.style.color = '';
if (!name || !pass) { errEl.textContent = 'Benutzername/E-Mail und Passwort erforderlich.'; return; }
var inv = getUrlInviteCode();
/* Schritt 1: Login-Request. NUR ein echter fetch-Reject (Netzwerk,
DNS, TLS, Abort) zaehlt als "Verbindungsfehler". HTTP-Antworten
mit 4xx/5xx erreichen "r" und werden weiter unten ausgewertet. */
var r;
try {
var r = await fetch(API_BASE + '/auth/login', {
r = await fetch(API_BASE + '/auth/login', {
method: 'POST', credentials: 'include',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
@@ -3599,38 +3604,61 @@ async function doLogin() {
invite_code: inv
})
});
if (r.ok) {
try {
var ld = await r.json();
if (ld.practice_id) localStorage.setItem('aza_practice_id', ld.practice_id);
if (ld.practice_bind_source) try {
sessionStorage.setItem('aza_practice_bind', ld.practice_bind_source);
} catch (eB) {}
var saveUser = (ld.display_name || name).trim();
localStorage.setItem('aza_last_login_user', saveUser);
try {
var u = new URL(window.location.href);
if (u.searchParams.get('invite')) {
clearEmpfangLocalSelectionAfterPracticeSwitch();
u.searchParams.delete('invite');
history.replaceState({}, '', u.pathname + u.search + u.hash);
}
} catch (eu) {}
} catch(e) {}
if (!await onAuthSuccess()) errEl.textContent = 'Anmeldung fehlgeschlagen.';
} catch (eNet) {
errEl.style.color = '#842029';
errEl.textContent = 'Verbindungsfehler.';
return;
}
/* Schritt 2: HTTP-Fehler (z.B. 400/401/403/409/500) — echte
Servermeldung anzeigen, nicht mit "Verbindungsfehler" maskieren. */
if (!r.ok) {
var d = {};
try { d = await r.json(); } catch (_eJ) { d = {}; }
errEl.style.color = '#842029';
var det = d && d.detail;
if (typeof det === 'object' && det !== null && det.message) {
errEl.textContent = det.message;
} else if (typeof det === 'string') {
errEl.textContent = det;
} else {
var d = await r.json().catch(function(){ return {}; });
errEl.style.color = '#842029';
var det = d.detail;
if (typeof det === 'object' && det !== null && det.message) {
errEl.textContent = det.message;
} else if (typeof det === 'string') {
errEl.textContent = det;
} else {
errEl.textContent = d.error || 'Anmeldung fehlgeschlagen.';
}
errEl.textContent = (d && d.error) || 'Anmeldung fehlgeschlagen.';
}
} catch(e) { errEl.style.color = '#842029'; errEl.textContent = 'Verbindungsfehler.'; }
return;
}
/* Schritt 3: Erfolgreicher Server-Login. Lokales State-Update — falls
etwas hier scheitert, ist die Session serverseitig trotzdem gueltig. */
try {
var ld = await r.json();
if (ld.practice_id) localStorage.setItem('aza_practice_id', ld.practice_id);
if (ld.practice_bind_source) try {
sessionStorage.setItem('aza_practice_bind', ld.practice_bind_source);
} catch (eB) {}
var saveUser = (ld.display_name || name).trim();
localStorage.setItem('aza_last_login_user', saveUser);
try {
var u = new URL(window.location.href);
if (u.searchParams.get('invite')) {
clearEmpfangLocalSelectionAfterPracticeSwitch();
u.searchParams.delete('invite');
history.replaceState({}, '', u.pathname + u.search + u.hash);
}
} catch (eu) {}
} catch (_eR) {}
/* Schritt 4: UI-Initialisierung. Eigener try/catch, damit ein Fehler
hier NICHT mehr als "Verbindungsfehler" oben durchschlaegt. */
try {
var ok = await onAuthSuccess();
if (!ok) {
errEl.style.color = '#842029';
errEl.textContent = 'Anmeldung fehlgeschlagen.';
}
} catch (_eA) {
errEl.style.color = '#842029';
errEl.textContent = 'Anmeldung erfolgreich, aber Initialisierung fehlgeschlagen. Bitte Seite neu laden.';
}
}
async function doRegister() {