From be26703908c8ea351c7b80272890b5387cc4a16c Mon Sep 17 00:00:00 2001 From: olcxja Date: Fri, 29 May 2026 08:54:18 +0200 Subject: [PATCH] add DM screen --- android/app/src/main/assets/public/index.html | 6 +- android/app/src/main/assets/public/main.js | 100 +++++++++++++++++- android/app/src/main/assets/public/screens.js | 15 +++ android/app/src/main/assets/public/style.css | 76 +++++++++++++ webroot/index.html | 6 +- webroot/main.js | 100 +++++++++++++++++- webroot/screens.js | 15 +++ webroot/style.css | 76 +++++++++++++ 8 files changed, 386 insertions(+), 8 deletions(-) diff --git a/android/app/src/main/assets/public/index.html b/android/app/src/main/assets/public/index.html index b6eb73ec..95451452 100644 --- a/android/app/src/main/assets/public/index.html +++ b/android/app/src/main/assets/public/index.html @@ -127,12 +127,12 @@ async function refreshDms() { try { - - showAction("action.dm.fetch", "dmrefresh"); let res = await fetchEncrypted("user/dm/list"); - clearAction("dmrefresh"); + if (typeof renderDms === 'function') { + await renderDms(res); + } } catch (e) { clearAction("dmrefresh"); diff --git a/android/app/src/main/assets/public/main.js b/android/app/src/main/assets/public/main.js index 72f3ea8f..d5eb05ad 100644 --- a/android/app/src/main/assets/public/main.js +++ b/android/app/src/main/assets/public/main.js @@ -1234,8 +1234,11 @@ async function switchDetailsContent(title, content) function clickCollapseDms() { var collapseDmsBtn = document.getElementById("collapse-dms"); - collapseDmsBtn.classList.toggle("collapsed"); + var dmsList = document.getElementById("dms-list"); + if (dmsList) { + dmsList.style.display = collapseDmsBtn.classList.contains("collapsed") ? "none" : ""; + } } function clickCollapseGroups() { @@ -1471,6 +1474,7 @@ async function acceptInvite(targetId) { //TODO: Implement key generation clearAction("invite.action"); showBlahNotification(res || "success:invite.accepted"); await loadInvites('received'); + await refreshDms(); } catch (e) { clearAction("invite.action"); showBlahNotification("error:something.wrong"); @@ -1679,4 +1683,98 @@ function handleMobileSwipe() { } } } +} + +async function renderDms(res) { + let container = document.getElementById("dms-list"); + if (!container) return; + + if (res && res !== "") { + let parsed = JSON.parse(res); + let dms = parsed.dms || {}; + let dmEntries = Object.entries(dms); + + // Sort by timestamp descending + dmEntries.sort((a,b) => (parseInt(b[1].string2) || 0) - (parseInt(a[1].string2) || 0)); + + let html = ""; + let count = 0; + + for (let [dmId, dmData] of dmEntries) { + let parts = dmId.split('_'); + let myId = `${id};${host}`; + let targetId = parts[0] === myId ? parts[1] : parts[0]; + + let targetUsername = await fetchAsync(`${url}/idtoname?id=${targetId}`); + if (!targetUsername || targetUsername.trim() === "" || targetUsername.startsWith("error:")) continue; + + let pfp = await getAvatarUrl(targetId, targetUsername); + let displayName = targetUsername.split(':')[0]; + + html += ` + + `; + count++; + } + + if (count > 0) { + container.innerHTML = html; + container.classList.remove("empty"); + } else { + container.innerHTML = `

desc.no.dms

`; + container.classList.add("empty"); + let blahTags = container.getElementsByTagName("blah"); + for (let i = 0; i < blahTags.length; i++) { + blahTags[i].innerHTML = processBlah(blahTags[i].innerHTML); + } + } + } else { + container.innerHTML = `

desc.no.dms

`; + container.classList.add("empty"); + let blahTags = container.getElementsByTagName("blah"); + for (let i = 0; i < blahTags.length; i++) { + blahTags[i].innerHTML = processBlah(blahTags[i].innerHTML); + } + } +} + +var currentDmId = null; +var currentDmKey = null; // AES key for encrypting/decrypting messages + +async function openDm(dmId, username, targetId) { + try { + showAction("action.dm.opening", "dmopen"); + + currentDmKey = await ensureDmRoomKey(dmId); + if (!currentDmKey) { + throw new Error("Missing DM room key"); + } + currentDmId = dmId; + + let pfp = await getAvatarUrl(targetId, username); + let iconHtml = ``; + await switchRoomContent(username.split(':')[0], chatScreen, false, iconHtml); + + let msgContainer = document.getElementById("chat-messages"); + if (msgContainer) { + msgContainer.innerHTML = `
desc.messages.encryption.active
`; + let blahTags = msgContainer.getElementsByTagName("blah"); + for (let i = 0; i < blahTags.length; i++) { + blahTags[i].innerHTML = processBlah(blahTags[i].innerHTML); + } + } + + setActiveRoombarItem(`dm-btn-${dmId}`); + clearAction("dmopen"); + } catch (e) { + clearAction("dmopen"); + console.error(e); + showBlahNotification("error:dm.open.failed"); + } } \ No newline at end of file diff --git a/android/app/src/main/assets/public/screens.js b/android/app/src/main/assets/public/screens.js index 94a426fd..d8a65380 100644 --- a/android/app/src/main/assets/public/screens.js +++ b/android/app/src/main/assets/public/screens.js @@ -129,6 +129,20 @@ var invitesEntry = ` `; +var chatScreen = ` +
+
+ +
+
+ + +
+
+`; + //roombars var homeRoomBar = ` +
`; +var chatScreen = ` +
+
+ +
+
+ + +
+
+`; + //roombars var homeRoomBar = ` +