let friends = [];
let shareTargetId = null;
let settings = { publicBaseUrl: '' };
async function checkSession() {
const res = await fetch('/api/session');
const data = await res.json();
if (data.role !== 'admin') {
window.location.href = '/';
}
}
async function loadSettings() {
const res = await fetch('/api/settings');
if (!res.ok) return;
const data = await res.json();
settings = data.settings || { publicBaseUrl: '' };
document.getElementById('publicBaseUrl').value = settings.publicBaseUrl || '';
}
document.getElementById('saveSettingsBtn').addEventListener('click', async () => {
const publicBaseUrl = document.getElementById('publicBaseUrl').value.trim();
const res = await fetch('/api/settings', {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ publicBaseUrl }),
});
const data = await res.json();
if (res.ok) {
settings = data.settings;
const msg = document.getElementById('settingsSaved');
msg.textContent = 'Gespeichert ✓';
msg.classList.add('show');
setTimeout(() => msg.classList.remove('show'), 1800);
}
});
function baseUrl() {
return settings.publicBaseUrl && settings.publicBaseUrl.length
? settings.publicBaseUrl
: window.location.origin;
}
async function loadFriends() {
const res = await fetch('/api/friends');
if (res.status === 401) { window.location.href = '/'; return; }
const data = await res.json();
friends = data.friends || [];
renderFriends();
}
function renderFriends() {
const grid = document.getElementById('friendGrid');
const emptyMsg = document.getElementById('emptyMsg');
grid.innerHTML = '';
emptyMsg.style.display = friends.length ? 'none' : 'block';
friends.forEach((f) => {
const el = document.createElement('div');
el.className = 'friend-card';
const thumbHtml = f.profileImage
? ``
: `
${data.error}
`; return; } document.getElementById('newName').value = ''; loadFriends(); }); async function deleteFriend(id) { const f = friends.find((x) => x.id === id); if (!confirm(`"${f ? f.name : 'Freund'}" wirklich löschen? Alle Fotos und Einträge gehen dabei verloren.`)) return; const res = await fetch(`/api/friends/${id}`, { method: 'DELETE' }); if (res.ok) loadFriends(); } function openShareModal(id) { shareTargetId = id; const f = friends.find((x) => x.id === id); document.getElementById('shareFriendName').textContent = f ? f.name : ''; document.getElementById('sharePw').value = ''; document.getElementById('shareErr').innerHTML = ''; const linkBox = document.getElementById('shareLinkBox'); if (f && f.shareEnabled) { linkBox.style.display = 'block'; document.getElementById('shareLinkInput').value = `${baseUrl()}/share/${id}`; } else { linkBox.style.display = 'none'; } document.getElementById('shareModal').style.display = 'flex'; } document.getElementById('shareCloseBtn').addEventListener('click', () => { document.getElementById('shareModal').style.display = 'none'; }); document.getElementById('shareEnableBtn').addEventListener('click', async () => { const pw = document.getElementById('sharePw').value; const errBox = document.getElementById('shareErr'); errBox.innerHTML = ''; const res = await fetch(`/api/friends/${shareTargetId}/share`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ enabled: true, password: pw }), }); const data = await res.json(); if (!res.ok) { errBox.innerHTML = `${data.error}
`; return; } document.getElementById('shareLinkBox').style.display = 'block'; document.getElementById('shareLinkInput').value = `${baseUrl()}/share/${shareTargetId}`; await loadFriends(); }); document.getElementById('shareDisableBtn').addEventListener('click', async () => { const res = await fetch(`/api/friends/${shareTargetId}/share`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ enabled: false }), }); if (res.ok) { document.getElementById('shareLinkBox').style.display = 'none'; await loadFriends(); } }); document.getElementById('copyLinkBtn').addEventListener('click', () => { const input = document.getElementById('shareLinkInput'); input.select(); navigator.clipboard.writeText(input.value).catch(() => {}); }); document.getElementById('logoutBtn').addEventListener('click', async () => { await fetch('/api/logout', { method: 'POST' }); window.location.href = '/'; }); // --- Sichern & Wiederherstellen --- function showTransferMsg(text, isError) { const box = document.getElementById('transferMsg'); box.innerHTML = isError ? `${text}
` : `${text}
`; } document.getElementById('bookExportBtn').addEventListener('click', () => { window.location.href = '/api/book/export'; }); document.getElementById('bookImportBtn').addEventListener('click', async () => { const fileInput = document.getElementById('bookImportFile'); const file = fileInput.files[0]; if (!file) { showTransferMsg('Bitte zuerst eine ZIP-Datei auswählen.', true); return; } const replaceAll = document.getElementById('bookImportReplace').checked; if (replaceAll && !confirm('Wirklich ALLE bestehenden Freunde vor dem Import löschen?')) return; const fd = new FormData(); fd.append('file', file); fd.append('replaceAll', replaceAll ? 'true' : 'false'); showTransferMsg('Importiere...', false); const res = await fetch('/api/book/import', { method: 'POST', body: fd }); const data = await res.json(); if (res.ok) { showTransferMsg(`${data.imported.length} Freund(e) importiert: ${data.imported.join(', ') || '–'}`, false); fileInput.value = ''; loadFriends(); } else { showTransferMsg(data.error || 'Import fehlgeschlagen.', true); } }); document.getElementById('friendImportBtn').addEventListener('click', async () => { const fileInput = document.getElementById('friendImportFile'); const file = fileInput.files[0]; if (!file) { showTransferMsg('Bitte zuerst eine ZIP-Datei auswählen.', true); return; } const fd = new FormData(); fd.append('file', file); showTransferMsg('Importiere...', false); const res = await fetch('/api/friends/import', { method: 'POST', body: fd }); const data = await res.json(); if (res.ok) { showTransferMsg(`"${data.friend.name}" wurde importiert.`, false); fileInput.value = ''; loadFriends(); } else { showTransferMsg(data.error || 'Import fehlgeschlagen.', true); } }); checkSession(); loadSettings(); loadFriends();