|
|
@@ -357,7 +357,7 @@
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- otpCooldownMessage.textContent = 'Neuer Code in ' + String(state.otpCooldownRemaining) + 's verfuegbar.';
|
|
|
+ otpCooldownMessage.textContent = 'Neuer Code in ' + String(state.otpCooldownRemaining) + 's verfügbar.';
|
|
|
state.otpCooldownRemaining -= 1;
|
|
|
};
|
|
|
|
|
|
@@ -1298,7 +1298,7 @@
|
|
|
await deleteUploadedFile(field, index);
|
|
|
setFeedback('Upload gelöscht.', false);
|
|
|
} catch (err) {
|
|
|
- handleProtectedError(err, 'Loeschen fehlgeschlagen.', 'wizard');
|
|
|
+ handleProtectedError(err, 'Löschen fehlgeschlagen.', 'wizard');
|
|
|
} finally {
|
|
|
deleteBtn.disabled = false;
|
|
|
}
|
|
|
@@ -1432,9 +1432,9 @@
|
|
|
const inactivityMinutes = Math.round(inactivitySeconds / 60);
|
|
|
if (inactivityMinutes % 60 === 0) {
|
|
|
const hours = inactivityMinutes / 60;
|
|
|
- return 'nach ' + String(hours) + ' Stunde' + (hours === 1 ? '' : 'n') + ' Inaktivitaet';
|
|
|
+ return 'nach ' + String(hours) + ' Stunde' + (hours === 1 ? '' : 'n') + ' Inaktivität';
|
|
|
}
|
|
|
- return 'nach ' + String(inactivityMinutes) + ' Minuten Inaktivitaet';
|
|
|
+ return 'nach ' + String(inactivityMinutes) + ' Minuten Inaktivität';
|
|
|
}
|
|
|
|
|
|
function handleProtectedAuthFailure(payload) {
|
|
|
@@ -1454,7 +1454,7 @@
|
|
|
const isExpired = Boolean(payload && payload.auth_expired);
|
|
|
const defaultMessage = isExpired
|
|
|
? 'Ihre Sitzung ist ' + inactivityInfoText() + ' abgelaufen. Bitte erneut verifizieren.'
|
|
|
- : 'Bitte zuerst E-Mail und Sicherheitscode bestaetigen.';
|
|
|
+ : 'Bitte zuerst E-Mail und Sicherheitscode bestätigen.';
|
|
|
|
|
|
setFeedback((payload && payload.message) || defaultMessage, true, 'start');
|
|
|
setDraftStatus(isExpired ? 'Sitzung abgelaufen' : 'Verifizierung erforderlich', true);
|
|
|
@@ -1737,7 +1737,7 @@
|
|
|
lockEmail(email);
|
|
|
setResetActionVisible(true);
|
|
|
hideOtpSection();
|
|
|
- setFeedback(result.message || 'E-Mail erfolgreich bestaetigt.', false, 'start');
|
|
|
+ setFeedback(result.message || 'E-Mail erfolgreich bestätigt.', false, 'start');
|
|
|
markUserActivity();
|
|
|
disclaimerSection.classList.remove('hidden');
|
|
|
wizardSection.classList.add('hidden');
|
|
|
@@ -1750,11 +1750,11 @@
|
|
|
const payload = (err && err.payload) || {};
|
|
|
const attemptsLeft = Number(payload.attempts_left);
|
|
|
if (Number.isFinite(attemptsLeft) && attemptsLeft >= 0 && attemptsLeft < 5) {
|
|
|
- setStartOtpError((payload.message || 'Code ungueltig.') + ' Verbleibende Versuche: ' + String(attemptsLeft));
|
|
|
+ setStartOtpError((payload.message || 'Code ungültig.') + ' Verbleibende Versuche: ' + String(attemptsLeft));
|
|
|
} else {
|
|
|
- setStartOtpError(payload.message || err.message || 'Code konnte nicht bestaetigt werden.');
|
|
|
+ setStartOtpError(payload.message || err.message || 'Code konnte nicht bestätigt werden.');
|
|
|
}
|
|
|
- setFeedback(payload.message || err.message || 'Code konnte nicht bestaetigt werden.', true, 'start');
|
|
|
+ setFeedback(payload.message || err.message || 'Code konnte nicht bestätigt werden.', true, 'start');
|
|
|
startOtpInput.focus();
|
|
|
} finally {
|
|
|
if (verifyOtpBtn) {
|
|
|
@@ -1768,8 +1768,8 @@
|
|
|
|
|
|
async function openWizardForVerifiedEmail() {
|
|
|
if (!state.email || !state.isVerified) {
|
|
|
- setFeedback('Bitte zuerst E-Mail und Sicherheitscode bestaetigen.', true, 'start');
|
|
|
- return;
|
|
|
+ setFeedback('Bitte zuerst E-Mail und Sicherheitscode bestätigen.', true, 'start');
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
@@ -1788,7 +1788,7 @@
|
|
|
);
|
|
|
setResetActionVisible(false);
|
|
|
stopAutosave();
|
|
|
- return;
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
disclaimerSection.classList.add('hidden');
|
|
|
@@ -1808,15 +1808,25 @@
|
|
|
setDraftStatus('Neuer Entwurf gestartet', false);
|
|
|
}
|
|
|
setFeedback('', false, 'wizard');
|
|
|
+ return true;
|
|
|
} catch (err) {
|
|
|
- const handled = handleProtectedError(err, 'Laden fehlgeschlagen.', 'start');
|
|
|
- if (!handled) {
|
|
|
- // keep default message already set
|
|
|
- }
|
|
|
+ handleProtectedError(err, 'Laden fehlgeschlagen.', 'start');
|
|
|
+ return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- function initAutoOtpForRememberedEmail() {
|
|
|
+ async function resumeVerifiedSession(email) {
|
|
|
+ const normalized = normalizeEmail(email);
|
|
|
+ if (!isValidEmail(normalized)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ lockEmail(normalized);
|
|
|
+ setResetActionVisible(true);
|
|
|
+ return openWizardForVerifiedEmail();
|
|
|
+ }
|
|
|
+
|
|
|
+ async function initAutoOtpForRememberedEmail() {
|
|
|
const rememberedEmail = normalizeEmail(getRememberedEmail());
|
|
|
if (rememberedEmail === '' || !isValidEmail(rememberedEmail)) {
|
|
|
return;
|
|
|
@@ -1825,8 +1835,19 @@
|
|
|
startEmailInput.value = rememberedEmail;
|
|
|
updateStartEmailRequiredMarker();
|
|
|
|
|
|
- if (!hasAutoOtpSessionFlag(rememberedEmail)) {
|
|
|
- requestOtpFlow(rememberedEmail, { autoStart: true });
|
|
|
+ const resumed = await resumeVerifiedSession(rememberedEmail);
|
|
|
+ if (resumed) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (state.isVerified) {
|
|
|
+ unlockEmail(false, false);
|
|
|
+ startEmailInput.value = rememberedEmail;
|
|
|
+ updateStartEmailRequiredMarker();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!state.isVerified && !hasAutoOtpSessionFlag(rememberedEmail)) {
|
|
|
+ await requestOtpFlow(rememberedEmail, { autoStart: true });
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -1888,7 +1909,7 @@
|
|
|
setFeedback('Alle gespeicherten Daten wurden gelöscht. Sie können neu starten.', false);
|
|
|
startEmailInput.focus();
|
|
|
} catch (err) {
|
|
|
- handleProtectedError(err, 'Loeschen fehlgeschlagen.', 'start');
|
|
|
+ handleProtectedError(err, 'Löschen fehlgeschlagen.', 'start');
|
|
|
}
|
|
|
});
|
|
|
|