Weiter an den Locations gearbeitet
Some checks failed
Host-Based Deploy (Java 21 Fix) / build-and-run (push) Has been cancelled

This commit is contained in:
2026-04-06 22:48:34 +02:00
parent 0f9f109067
commit 5ffb99c9b5
81 changed files with 2817 additions and 352 deletions

View File

@@ -341,7 +341,8 @@
if (!user) return;
myId = user.userId;
loadConversations();
const urlPartnerId = new URLSearchParams(window.location.search).get('userId');
const params = new URLSearchParams(window.location.search);
const urlPartnerId = params.get('partnerId') || params.get('userId');
if (urlPartnerId) openThread(urlPartnerId);
})
.catch(() => {});
@@ -363,31 +364,36 @@
return;
}
convs.forEach(c => {
const isLocation = c.partner.friendStatus === 'LOCATION';
const av = c.partner.profilePicture
? `<img src="data:image/png;base64,${c.partner.profilePicture}" alt="" style="cursor:zoom-in;" onclick="event.stopPropagation();openLightbox(this.src)">`
: '◉';
: (isLocation ? '📍' : '◉');
const unreadHtml = c.unreadCount > 0
? `<span class="conv-unread">${c.unreadCount}</span>`
: '';
const preview = c.lastMessage
? (c.lastMessage.text.startsWith('data:image/') ? '📷 Bild' : esc(c.lastMessage.text.substring(0, 40)))
: '';
const locationBadge = isLocation
? `<span style="font-size:0.6rem;background:var(--color-secondary);color:var(--color-muted);border-radius:4px;padding:0.1rem 0.3rem;margin-left:0.3rem;">Location</span>`
: '';
const li = document.createElement('li');
li.className = 'conv-item' + (c.partner.userId === activePartnerId ? ' active' : '');
li.dataset.partnerId = c.partner.userId;
li.dataset.isLocation = isLocation ? '1' : '';
li.innerHTML = `
<div class="conv-avatar">${av}</div>
<div class="conv-info">
<div class="conv-name">${esc(c.partner.name)}</div>
<div class="conv-name">${esc(c.partner.name)}${locationBadge}</div>
<div class="conv-preview">${preview}</div>
</div>
${unreadHtml}`;
li.addEventListener('click', () => openThread(c.partner.userId, c.partner.name, c.partner.profilePicture));
li.addEventListener('click', () => openThread(c.partner.userId, c.partner.name, c.partner.profilePicture, isLocation));
list.appendChild(li);
});
}
async function openThread(partnerId, partnerName, partnerPic) {
async function openThread(partnerId, partnerName, partnerPic, isLocation) {
activePartnerId = partnerId;
oldestSentAt = null;
newestSentAt = null;
@@ -398,17 +404,51 @@
li.classList.toggle('active', li.dataset.partnerId === partnerId);
});
// isLocation ggf. aus DOM ermitteln oder per API auflösen
if (isLocation === undefined) {
const convItem = document.querySelector(`.conv-item[data-partner-id="${partnerId}"]`);
if (convItem) {
isLocation = convItem.dataset.isLocation === '1';
} else {
// Noch kein Conv-Item (neue/unbekannte Konversation) → per API prüfen
try {
const locRes = await fetch('/locations/virtual/' + partnerId);
if (locRes.ok) {
isLocation = true;
const loc = await locRes.json();
if (!partnerName) partnerName = loc.name;
if (!partnerPic && loc.profilePictureLq) partnerPic = loc.profilePictureLq;
} else {
isLocation = false;
}
} catch { isLocation = false; }
}
}
if (!partnerName) {
const convItem = document.querySelector(`.conv-item[data-partner-id="${partnerId}"]`);
partnerName = convItem ? convItem.querySelector('.conv-name').textContent : '…';
// .conv-name enthält ggf. das Location-Badge nur Textinhalt nehmen
partnerName = convItem ? convItem.querySelector('.conv-name').firstChild.textContent.trim() : '…';
}
const locationBadge = isLocation
? ` <span style="font-size:0.65rem;background:var(--color-secondary);color:var(--color-muted);border-radius:4px;padding:0.1rem 0.35rem;vertical-align:middle;">Location</span>`
: '';
if (isLocation) {
document.getElementById('threadPartnerName').innerHTML =
`${esc(partnerName)}${locationBadge}`;
} else {
document.getElementById('threadPartnerName').innerHTML =
`<a href="/community/benutzer.html?userId=${partnerId}" style="color:inherit;text-decoration:none;">${esc(partnerName)}</a>`;
}
document.getElementById('threadPartnerName').innerHTML =
`<a href="/community/benutzer.html?userId=${partnerId}" style="color:inherit;text-decoration:none;">${esc(partnerName)}</a>`;
const avatarEl = document.getElementById('threadPartnerAvatar');
if (partnerPic) {
avatarEl.innerHTML = `<img src="data:image/png;base64,${partnerPic}" alt="" style="cursor:zoom-in;" onclick="openLightbox(this.src)">`;
avatarEl.style.display = '';
} else if (isLocation) {
avatarEl.innerHTML = '📍';
avatarEl.style.display = '';
} else {
avatarEl.style.display = 'none';
}
@@ -548,7 +588,12 @@
input.value = text;
return;
}
await pollNewMessages();
// War die Konversation leer, neu laden; sonst nur neue Nachrichten pollen
if (newestSentAt) {
await pollNewMessages();
} else {
await loadInitialThread();
}
} catch (e) { console.error(e); }
}