Files
xxx-sphere-web/bin/main/static/reset-password.html

143 lines
4.9 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<link rel="icon" href="/img/icon.png" type="image/png">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Neues Passwort xXx Sphere</title>
<link rel="stylesheet" href="/css/variables.css">
<link rel="stylesheet" href="/css/style.css">
<style>
.overlay {
display: none;
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.7);
z-index: 100;
align-items: center;
justify-content: center;
}
.overlay.active {
display: flex;
}
.modal {
background: var(--color-card);
border: 1px solid var(--color-secondary);
border-radius: 12px;
padding: 2rem;
max-width: 340px;
width: 90%;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
text-align: center;
}
.modal p {
color: var(--color-text);
font-size: 0.95rem;
margin-bottom: 1.5rem;
line-height: 1.5;
}
</style>
</head>
<body>
<div class="card">
<img src="icon.png" alt="Logo">
<h1>Neues Passwort</h1>
<p class="subtitle">Gib dein neues Passwort ein.</p>
<label for="password">Neues Passwort</label>
<input type="password" id="password" placeholder="••••••••" autocomplete="new-password" />
<label for="passwordConfirm">Passwort wiederholen</label>
<input type="password" id="passwordConfirm" placeholder="••••••••" autocomplete="new-password" />
<button class="full-width" id="submitBtn" onclick="submit()">Passwort speichern</button>
<div class="message" id="message"></div>
</div>
<div class="overlay" id="overlay">
<div class="modal">
<p>Dein Passwort wurde erfolgreich geändert. Du kannst dich jetzt anmelden.</p>
<button class="full-width" onclick="goToLogin()">Zum Login</button>
</div>
</div>
<script>
document.addEventListener('keydown', e => {
if (e.key === 'Enter') submit();
});
function getToken() {
return new URLSearchParams(window.location.search).get('token');
}
document.addEventListener('DOMContentLoaded', () => {
if (!getToken()) {
showMessage('Ungültiger oder fehlender Reset-Link.', 'error');
document.getElementById('submitBtn').disabled = true;
}
});
async function submit() {
const password = document.getElementById('password').value;
const passwordConfirm = document.getElementById('passwordConfirm').value;
const btn = document.getElementById('submitBtn');
const token = getToken();
if (!password || !passwordConfirm) {
showMessage('Bitte beide Felder ausfüllen.', 'error');
return;
}
if (password !== passwordConfirm) {
showMessage('Die Passwörter stimmen nicht überein.', 'error');
return;
}
if (!token) {
showMessage('Ungültiger Reset-Link.', 'error');
return;
}
btn.disabled = true;
btn.textContent = 'Wird gespeichert…';
hideMessage();
try {
const response = await fetch('/password-reset/confirm', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ token, password })
});
if (response.ok) {
document.getElementById('overlay').classList.add('active');
} else {
showMessage('Der Reset-Link ist ungültig oder abgelaufen.', 'error');
btn.disabled = false;
btn.textContent = 'Passwort speichern';
}
} catch (err) {
showMessage('Server nicht erreichbar.', 'error');
btn.disabled = false;
btn.textContent = 'Passwort speichern';
console.error(err);
}
}
function goToLogin() {
window.location.href = '/login.html';
}
function showMessage(text, type) {
const el = document.getElementById('message');
el.textContent = text;
el.className = `message ${type}`;
el.style.display = 'block';
}
function hideMessage() {
document.getElementById('message').style.display = 'none';
}
</script>
</body>
</html>