diff --git a/src/pages/chat/chat.ts b/src/pages/chat/chat.ts index 80c528c..a6a1e92 100755 --- a/src/pages/chat/chat.ts +++ b/src/pages/chat/chat.ts @@ -423,106 +423,123 @@ class ChatElement extends HTMLElement { const service = await Services.getInstance(); const members = await service.getAllMembers(); - const database = await Database.getInstance(); - const db = database.db; + const processes = await service.getProcesses(); const memberList = document.createElement('ul'); memberList.className = 'member-list active'; - const prioritizedMembers: [string, any][] = []; - const remainingMembers: [string, any][] = []; - + // Partition members into prioritized and remaining arrays. + const prioritizedMembers: [string, Member][] = []; + const remainingMembers: [string, Member][] = []; for (const [processId, member] of Object.entries(members)) { if (this.dmMembersSet.has(processId)) { - prioritizedMembers.push([processId, member]); + prioritizedMembers.push([processId, member]); } else { - remainingMembers.push([processId, member]); + remainingMembers.push([processId, member]); } } - const sortedMembers = prioritizedMembers.concat(remainingMembers); - for (const [processId, member] of sortedMembers) { + // Process each member. + for (const [processId, member] of sortedMembers) { const memberItem = document.createElement('li'); memberItem.className = 'member-item'; + // Apply special styling if the member is prioritized. if (this.dmMembersSet.has(processId)) { - memberItem.style.cssText = ` - background-color: var(--accent-color); - transition: background-color 0.3s ease; - cursor: pointer; - `; - memberItem.onmouseover = () => { - memberItem.style.backgroundColor = 'var(--accent-color-hover)'; - }; - memberItem.onmouseout = () => { - memberItem.style.backgroundColor = 'var(--accent-color)'; - }; + memberItem.style.cssText = ` + background-color: var(--accent-color); + transition: background-color 0.3s ease; + cursor: pointer; + `; + memberItem.addEventListener('mouseover', () => { + memberItem.style.backgroundColor = 'var(--accent-color-hover)'; + }); + memberItem.addEventListener('mouseout', () => { + memberItem.style.backgroundColor = 'var(--accent-color)'; + }); } - + + // Create a container for the member content. const memberContainer = document.createElement('div'); memberContainer.className = 'member-container'; + // Create the emoji span and load its label. const emojiSpan = document.createElement('span'); emojiSpan.className = 'member-emoji'; - const emojis = await addressToEmoji(processId); emojiSpan.dataset.emojis = emojis; - - const transaction = db.transaction("labels", "readonly"); - const store = transaction.objectStore("labels"); - const request = store.get(emojis); - - request.onsuccess = () => { - const label = request.result; - emojiSpan.textContent = label ? `${label.label} (${emojis})` : `Member (${emojis})`; - }; - - request.onerror = () => { - emojiSpan.textContent = `Member (${emojis})`; - }; + + // Get the member name, if any, and add it to the display + const process = processes[processId]; + let memberPublicName; + if (process) { + const publicMemberData = service.getPublicData(process); + if (publicMemberData) { + const extractedName = publicMemberData['memberPublicName']; + if (extractedName !== undefined && extractedName !== null) { + memberPublicName = extractedName; + } + } + } + if (!memberPublicName) { + memberPublicName = 'Unnamed Member'; + } + + emojiSpan.textContent = `${memberPublicName} (${emojis})` memberContainer.appendChild(emojiSpan); memberItem.appendChild(memberContainer); + // Add click handler to load member chat. memberItem.addEventListener('click', async () => { - await this.loadMemberChat(processId); + await this.loadMemberChat(processId); }); - + + // Create and configure the edit label button. const editLabelButton = document.createElement('button'); editLabelButton.className = 'edit-label-button'; editLabelButton.textContent = "✏️"; - editLabelButton.addEventListener("click", (event) => { event.stopPropagation(); }); - editLabelButton.addEventListener("dblclick", async (event) => { event.stopPropagation(); event.preventDefault(); - + const newLabel = prompt("Set a new name for the member:"); if (!newLabel) return; - - const editTransaction = db.transaction("labels", "readwrite"); - const editStore = editTransaction.objectStore("labels"); - - const labelObject = { emoji: emojis, label: newLabel }; - const putRequest = editStore.put(labelObject); - - putRequest.onsuccess = () => { - emojiSpan.textContent = `${newLabel} : ${emojis}`; - this.reloadMemberChat(processId); - }; + + const db = await Database.getInstance(); + this.updateLabelForEmoji(emojis, newLabel, db, emojiSpan, processId); }); - - memberList.appendChild(memberItem); memberContainer.appendChild(editLabelButton); + + memberList.appendChild(memberItem); } groupList.appendChild(memberList); } + // Helper function to update a label in IndexedDB. + private updateLabelForEmoji( + emojis: string, + newLabel: string, + db: IDBDatabase, + emojiSpan: HTMLElement, + processId: string + ) { + const transaction = db.transaction("labels", "readwrite"); + const store = transaction.objectStore("labels"); + const labelObject = { emoji: emojis, label: newLabel }; + const request = store.put(labelObject); + + request.onsuccess = () => { + emojiSpan.textContent = `${newLabel} : ${emojis}`; + this.reloadMemberChat(processId); + }; + } + private async lookForDmProcess(): Promise { const service = await Services.getInstance(); const processes = await service.getMyProcesses();