- Neuer Menüpunkt 'Mein Profil' statt 'Logout' - Profil-Page: Anzeigename, Persona (Freitext), Passwort ändern, Logout - ProfileEndpoint: GET/PUT /api/profile, PUT /api/profile/password - User-Persona im System-Prompt statt USER.md (Fallback: Anzeigename/Username) - SystemPromptBuilder: dataDir-Parameter entfernt, userPersona-Parameter hinzugefügt - DB-Migration: persona-Spalte in users-Tabelle
113 lines
3.8 KiB
JavaScript
113 lines
3.8 KiB
JavaScript
// ── Profile Page ──
|
|
|
|
registerPage('profile', {
|
|
async init() {
|
|
var profile = await apiGetProfile();
|
|
if (!profile) return;
|
|
|
|
var usernameInput = document.getElementById('profileUsername');
|
|
var displayNameInput = document.getElementById('profileDisplayName');
|
|
var personaInput = document.getElementById('profilePersona');
|
|
var saveBtn = document.getElementById('profileSaveBtn');
|
|
var messageDiv = document.getElementById('profileMessage');
|
|
|
|
var currentPwInput = document.getElementById('profileCurrentPassword');
|
|
var newPwInput = document.getElementById('profileNewPassword');
|
|
var confirmPwInput = document.getElementById('profileConfirmPassword');
|
|
var passwordBtn = document.getElementById('profilePasswordBtn');
|
|
var passwordMessageDiv = document.getElementById('profilePasswordMessage');
|
|
|
|
var logoutBtn = document.getElementById('profileLogoutBtn');
|
|
|
|
// Felder befüllen
|
|
usernameInput.value = profile.username || '';
|
|
displayNameInput.value = profile.displayName || '';
|
|
personaInput.value = profile.persona || '';
|
|
|
|
// Profil speichern
|
|
saveBtn.addEventListener('click', async function() {
|
|
saveBtn.disabled = true;
|
|
saveBtn.textContent = 'Speichern...';
|
|
messageDiv.hidden = true;
|
|
|
|
try {
|
|
var updated = await apiUpdateProfile({
|
|
displayName: displayNameInput.value.trim(),
|
|
persona: personaInput.value.trim()
|
|
});
|
|
|
|
// currentUser aktualisieren
|
|
if (currentUser) {
|
|
currentUser.displayName = updated.displayName;
|
|
}
|
|
|
|
messageDiv.textContent = 'Profil gespeichert';
|
|
messageDiv.className = 'profile-message profile-message-success';
|
|
messageDiv.hidden = false;
|
|
setTimeout(function() { messageDiv.hidden = true; }, 3000);
|
|
} catch (err) {
|
|
messageDiv.textContent = err.message;
|
|
messageDiv.className = 'profile-message profile-message-error';
|
|
messageDiv.hidden = false;
|
|
} finally {
|
|
saveBtn.disabled = false;
|
|
saveBtn.textContent = 'Speichern';
|
|
}
|
|
});
|
|
|
|
// Passwort ändern
|
|
passwordBtn.addEventListener('click', async function() {
|
|
passwordMessageDiv.hidden = true;
|
|
|
|
var currentPw = currentPwInput.value;
|
|
var newPw = newPwInput.value;
|
|
var confirmPw = confirmPwInput.value;
|
|
|
|
if (!currentPw || !newPw) {
|
|
passwordMessageDiv.textContent = 'Alle Felder ausfüllen';
|
|
passwordMessageDiv.className = 'profile-message profile-message-error';
|
|
passwordMessageDiv.hidden = false;
|
|
return;
|
|
}
|
|
|
|
if (newPw !== confirmPw) {
|
|
passwordMessageDiv.textContent = 'Neue Passwörter stimmen nicht überein';
|
|
passwordMessageDiv.className = 'profile-message profile-message-error';
|
|
passwordMessageDiv.hidden = false;
|
|
return;
|
|
}
|
|
|
|
passwordBtn.disabled = true;
|
|
passwordBtn.textContent = 'Ändern...';
|
|
|
|
try {
|
|
await apiChangePassword(currentPw, newPw);
|
|
|
|
currentPwInput.value = '';
|
|
newPwInput.value = '';
|
|
confirmPwInput.value = '';
|
|
|
|
passwordMessageDiv.textContent = 'Passwort geändert';
|
|
passwordMessageDiv.className = 'profile-message profile-message-success';
|
|
passwordMessageDiv.hidden = false;
|
|
setTimeout(function() { passwordMessageDiv.hidden = true; }, 3000);
|
|
} catch (err) {
|
|
passwordMessageDiv.textContent = err.message;
|
|
passwordMessageDiv.className = 'profile-message profile-message-error';
|
|
passwordMessageDiv.hidden = false;
|
|
} finally {
|
|
passwordBtn.disabled = false;
|
|
passwordBtn.textContent = 'Passwort ändern';
|
|
}
|
|
});
|
|
|
|
// Logout
|
|
logoutBtn.addEventListener('click', async function() {
|
|
await apiLogout();
|
|
currentUser = null;
|
|
navigateTo('login');
|
|
});
|
|
},
|
|
destroy() {}
|
|
});
|