diff --git a/index.html b/index.html index 86496cc..90a556f 100644 --- a/index.html +++ b/index.html @@ -23,99 +23,109 @@ }, //Required for Supernode operations - SNStorageID: "FEzk75EGMPEQMrCuPosGiwuK162hcEu49E", + SNStorageID: "FNaN9McoBAEFUjkRmNQRYLmBF8SpS7Tgfk", supernodes: {}, //each supnernode must be stored as floID : {uri:,pubKey:} //for app - application: "messenger", + application: "messenger", + adminID: "FMRsefPydWznGWneLqi4ABeQAJeFvtS3aQ", pubKeys: {}, contacts: {}, appendix: {} } @@ -675,7 +685,7 @@ messageTemplate = document.getElementById('message_template'), mailTemplate = document.getElementById('mail_template') const render = { - mailCard(mailRef, subject, timestamp, category, floID, content, markUnread){ + mailCard(floID, ref, subject, timestamp, content, markUnread){ let card = mailCardTemplate.content.cloneNode(true), cardContainer = card.querySelector('.mail-card'), time = new Date(timestamp).toString(), @@ -684,7 +694,6 @@ dateTime minutes = minutes.length === 1 ? `0${minutes}` : minutes let finalHours = hours - 12 > 0 ? `${hours - 12}:${minutes} pm` : `${hours}:${minutes} am` - if(new Date().getDate() === new Date(timestamp).getDate()) dateTime = finalHours else @@ -692,18 +701,30 @@ let mailSummery = content.split(' ') mailSummery.splice(16) mailSummery = mailSummery.join(' ') - cardContainer.setAttribute("name", mailRef); - if (Array.isArray(floID)) - floID = floID.join(","); + cardContainer.setAttribute("name", ref); + let contact; + if(Array.isArray(floID)){ + for(let f of floID) + if(floGlobals.contacts[f]){ + contact = floGlobals.contacts[f] + break; + } + contact = contact || `${floID[0].substring(12)}...`; + if(floID.length > 1) + contact = `${contact} & ${floID.length - 1} others(s)` + floID = floID.join(', ') + } else + contact = floGlobals.contacts[floID] || floID if(markUnread) cardContainer.classList.add('unread') - card.querySelector('.sender').textContent = floGlobals.contacts[floID] || floID + card.querySelector('.sender').textContent = contact card.querySelector('.subject').textContent = subject card.querySelector('.date').textContent = dateTime card.querySelector('.description').textContent = mailSummery return card }, - mail(senderName, floID, timestamp, category, subject, content){ + + mail(from, to, subject, timestamp, content){ let card = mailTemplate.content.cloneNode(true), cardContainer = card.querySelector('.mail'), time = new Date(timestamp).toString(), @@ -712,17 +733,27 @@ dateTime minutes = minutes.length === 1 ? `0${minutes}` : minutes let finalHours = hours - 12 > 0 ? `${hours - 12}:${minutes} pm` : `${hours}:${minutes} am` - if(new Date().getDate() === new Date(timestamp).getDate()) dateTime = finalHours else dateTime = time.slice(4, 10) - if (Array.isArray(floID)) - floID = floID.join(","); - if(category === 'receivedFrom') - card.querySelector('.sender-name').textContent = `From : ${senderName}` - if(category === 'sentTo') - card.querySelector('.sender-name').textContent = `To : ${senderName}` + let senderName, floID + if(from === myFloID){ + let count = 0, list = []; + to.forEach(f => floGlobals.contacts[f] ? list.push(floGlobals.contacts[f]): count++) + senderName = `To : ${list.join(', ')}` + if(count){ + if(list.length) + senderName = `${senderName} & ${count} other(s)` + else + senderName = `${senderName} ${count} Unknown people` + } + floID = to.join(', ') + } else { + senderName = `From : ${floGlobals.contacts[from] || ''}`; + floID = from + } + card.querySelector('.sender-name').textContent = senderName card.querySelector('.flo-id').textContent = floID card.querySelector('.mail-subject').textContent = subject card.querySelector('.date').textContent = dateTime; @@ -776,6 +807,24 @@ let currentDate, currentFloID + function renderDirectUI(data) { + console.log(data) + renderMessages(data.messages); + renderMailList(data.mails) + if(Object.keys(data.messages).length && activePage.button !== chatPageButton){ + chatPageButton.setAttribute('data-notifications', Object.keys(data.messages).length) + notify(`${Object.keys(data.messages).length} new message(s)`) + } + if(Object.keys(data.mails).length && activePage.button !== mailPageButton){ + mailPageButton.setAttribute('data-notifications', Object.keys(data.mails).length) + notify(`${Object.keys(data.mails).length} new mail(s)`) + } + } + + function renderGroupUI(data){ + console.log(data) + } + function randomHsl(saturation = 90, lightness = 50) { let hue = Math.random() * 360 let color = { @@ -1125,7 +1174,7 @@ 'Are you sure you want to Sign out?', "Sign Out", "Stay Signed In").then( result => { - floDapps.logout().then(result => { + floDapps.clearCredentials().then(result => { notify("Successfully Signed out", 'success') setTimeout(onLoadStartUp, 2000) }).catch(error => notify("Signout Unsuccessful", "error", error)) @@ -1136,7 +1185,7 @@ getConfirmation('Remove Account?', '**Remember to store your PRIVATE-KEY**\n*Private-Key will be needed to signIn again*\nAre you sure you want to remove account?', "Remove").then(result => { - floDapps.logout().then(result => { + floDapps.clearCredentials().then(result => { notify("Removed Account") setTimeout(onLoadStartUp, 2000) }).catch(error => notify("Remove Unsuccessful", "error", error)) @@ -1169,7 +1218,7 @@ getConfirmation('Clear Data?', `Are you sure you want to clear stored data?`, "Clear").then( result => { - floDapps.clearUserData().then(result => { + messenger.clearUserData().then(result => { notify("Successfully Cleared local data", 'success') setTimeout(onLoadStartUp, 2000) }).catch(error => notify(error, "error")) @@ -1192,9 +1241,10 @@ let refreshing = false function refresh(){ + return if(refreshing) return; refreshing = true - messenger.refreshInbox().then(data => { + messenger.requestDirectInbox().then(data => { renderMessages(data.messages) renderMailList(data.mails) if(Object.keys(data.messages).length && activePage.button !== chatPageButton){ @@ -1251,6 +1301,7 @@ return; } messenger.parseBackup(file).then(data => { + debugger; getConfirmation('Restore Data?', `Found: ${Object.keys(data.contacts).length} Contacts,\n ${Object.keys(data.messages).length} Messages, ${Object.keys(data.mails).length} Mails.`, "Restore" @@ -1285,11 +1336,12 @@ typeMessage.value = '' if(message.trim() === '') return messenger.sendMessage(message, receiver).then(data => { - render.messageBubble(data.floID, data.message, data.time, data.category) - chatContainer.scrollTo({left: 0, top: chatContainer.scrollHeight, behavior: 'smooth'}) - refreshCount = 0; - refreshTimeout = 10000; - setTimeout(refreshAgain, refreshTimeout) + renderMessages(data, false) + //render.messageBubble(data.floID, data.message, data.time, data.category) + //chatContainer.scrollTo({left: 0, top: chatContainer.scrollHeight, behavior: 'smooth'}) + //refreshCount = 0; + //refreshTimeout = 10000; + //setTimeout(refreshAgain, refreshTimeout) }).catch(error => notify(error, "error")); } @@ -1401,12 +1453,9 @@ return element; } - let frag = document.createDocumentFragment() - function renderMessages(data, markUnread = true) { let floID - console.log(data) - for (m in data) { + for (let m in data) { floID = data[m].floID render.messageBubble(data[m].floID, data[m].message, data[m].time, data[m].category) if (markUnread) @@ -1425,7 +1474,7 @@ textColor = contact.getAttribute('text-color'), backgroundColor = contact.getAttribute('background-color') let currentConversation = document.getElementById("receiver_floID").textContent; - console.log(floID, floGlobals.contacts[floID], currentConversation) + console.log(floID, floGlobals.contacts[floID]) if (currentConversation != "") document.getElementById(currentConversation).classList.add('hide-completely') let currentChat = document.getElementById(floID) @@ -1442,18 +1491,19 @@ messenger.removeMark(floID, "unread"); } - let sentMailFrag = document.createDocumentFragment() function renderMailList(mails, markUnread = true) { - for (m in mails) { - let { ref, subject, time, category, floID, content} = mails[m] - if(category === 'receivedFrom' || category === 'replyFrom') - frag.prepend(render.mailCard(ref, subject, time, category, floID, content, markUnread)); - if(category === 'sentTo' || category === 'replyTo') - sentMailFrag.prepend(render.mailCard(ref, subject, time, category, floID, content, markUnread)); + let inboxMailFrag = document.createDocumentFragment() + let sentMailFrag = document.createDocumentFragment() + for (let m in mails) { + let { from, to, prev, ref, subject, time, content } = mails[m] + if(from === myFloID) + sentMailFrag.prepend(render.mailCard(to, ref, subject, time, content, markUnread)) + else if(to.includes(myFloID)) + inboxMailFrag.prepend(render.mailCard(from, ref, subject, time, content, markUnread)) } - inboxMailContainer.prepend(frag) + inboxMailContainer.prepend(inboxMailFrag) sentMailContainer.prepend(sentMailFrag) - if(inboxMailContainer.children.length){ + if(inboxMailContainer.children.length || sentMailContainer.children.length){ document.getElementById('no_mails').classList.add('hide-completely') document.getElementById('all_mail_container').classList.remove('hide-completely') } @@ -1469,26 +1519,19 @@ clearElement(document.getElementById("mail_container")) messenger.getMail(mailRef).then(result => { - let {floID, time, category, subject, content, prevRef} = result - //add name (if available) - let senderName = floGlobals.contacts[floID] || ' '; + let { from, to, prev, ref, subject, time, content } = result //append the contents to mail container - document.getElementById("mail_container").append(render.mail(senderName, floID, time, category, subject, content)); + document.getElementById("mail_container").append(render.mail(from, to, subject, time, content)); //add prop for previous mail (if available) let prevMail = document.getElementById("prev_mail"); - prevMail.dataset["value"] = prevRef; - prevMail.style.display = prevRef ? 'block' : 'none'; + prevMail.dataset["value"] = prev; + prevMail.style.display = prev ? 'block' : 'none'; //set values for reply mail form if new view if (newView) { - if (floID.includes(',')) - document.getElementById("show_reply_popup").classList.add("hide-completely"); - else { - replyMailPopup.dataset["to"] = floID; - replyMailPopup.dataset["prevRef"] = mailRef; - subjectOfReplyMail.value = subject.startsWith("Re: ") ? result - .subject : `Re: ${subject}`; - document.getElementById("show_reply_popup").classList.remove("hide-completely"); - } + replyMailPopup.dataset["to"] = (from === myFloID ? to.join(',') : from) + replyMailPopup.dataset["prev"] = mailRef; + subjectOfReplyMail.value = subject.startsWith("Re: ") ? subject : `Re: ${subject}`; + document.getElementById("show_reply_popup").classList.remove("hide-completely"); } messenger.removeMark(mailRef, "unread"); }).catch(error => notify("Unable to read mail", "error", error)) @@ -1510,25 +1553,9 @@ recipients.push(tmp); }) messenger.sendMail(subject, content, recipients).then(result => { - console.log(result); - let sucessCount = Object.keys(result.success).length; - let errorCount = Object.keys(result.error).length - if (!sucessCount) - notify("Failed to send mail!", "error", result) - else { - if (errorCount) - notify( - `${Object.keys(result.success).length} Mail(s) sent! (${Object.keys(result.error).length} failed)`, - "warn", { - sent: result.success, - failed: result.error - }); - else - notify(`${Object.keys(result.success).length} Mail(s) sent!`) - let {ref, subject, time, category, floID, content} = result.data - sentMailContainer.prepend(render.mailCard(ref, subject, time, category, floID, content)); - composeMailPopup.hide() - } + notify(`Mail(s) sent!`) + renderMailList(result) + composeMailPopup.hide() }).catch(error => notify("Failed to send mail!", "error", error)) } catch (error) { notify(error, "error") @@ -1537,262 +1564,9597 @@ function replyMail() { let recipient = replyMailPopup.dataset.to; + if(recipient.includes(',')) + recipient = recipient.split(',') let subject = subjectOfReplyMail.value; let content = replyMailContent.value; - let prevRef = replyMailPopup.dataset.prevRef; - messenger.replyMail(prevRef, subject, content, recipient).then(data => { + let prev = replyMailPopup.dataset.prev; + messenger.sendMail(subject, content, recipient, prev).then(result => { notify(`Mail replied!`); + renderMailList(result) replyMailPopup.hide() - let {ref, subject, time, category, floID, content} = data - sentMailContainer.prepend(render.mailCard(ref, subject, time, category, floID, content)); - }).catch(error => notify("Failed to send mail!", "error", error)) + }).catch(error => notify("Failed to reply mail!", "error", error)) } - + + + + + + + +