Weiter an den Locations gearbeitet
Some checks failed
Host-Based Deploy (Java 21 Fix) / build-and-run (push) Has been cancelled
Some checks failed
Host-Based Deploy (Java 21 Fix) / build-and-run (push) Has been cancelled
This commit is contained in:
@@ -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); }
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user