diff --git a/app/lib/express.js b/app/lib/express.js index 09d3c5d..cb95c8f 100644 --- a/app/lib/express.js +++ b/app/lib/express.js @@ -107,6 +107,18 @@ router.post("/publish", async (req, res) => { res.redirect("/"); }); +// TODO: tie reading with deleting +router.post("/vanish", async (req, res) => { + const key = req.body.key; + + await ssbServer.publish({ + type: "delete", + dest: key, + }); + + res.send("ok"); +}); + router.post("/profile/:id/publish", async (req, res) => { const id = req.params.id; const visibility = req.body.visibility; diff --git a/app/lib/queries.js b/app/lib/queries.js index 0435818..255e4cf 100644 --- a/app/lib/queries.js +++ b/app/lib/queries.js @@ -117,9 +117,9 @@ const getPosts = (ssbServer, profile) => ); }); -const getVanishingMessages = (ssbServer, profile) => - debug("Fetching vanishing messages") || - new Promise((resolve, reject) => { +const getVanishingMessages = async (ssbServer, profile) => { + debug("Fetching vanishing messages"); + const messagesPromise = new Promise((resolve, reject) => { pull( // @ts-ignore cat([ @@ -165,15 +165,46 @@ const getVanishingMessages = (ssbServer, profile) => ), paramap(mapProfiles(ssbServer)), pull.collect((err, msgs) => { - debug("Done fetching vanishing messages"); - const entries = msgs.map((x) => x.value); - if (err) return reject(err); - return resolve(entries); + return resolve(msgs); }) ); }); + const deletedPromise = new Promise((resolve, reject) => { + pull( + ssbServer.query.read({ + reverse: true, + query: [ + { + $filter: { + value: { + author: profile.id, + content: { + type: "delete", + }, + }, + }, + }, + ], + }), + pull.collect((err, msgs) => { + if (err) return reject(err); + return resolve(Object.values(msgs)); + }) + ); + }); + + const [messages, deleted] = await Promise.all([ + messagesPromise, + deletedPromise, + ]); + const deletedIds = deleted.map((x) => x.value.content.dest); + + debug("Done fetching vanishing messages"); + return messages.filter((m) => !deletedIds.includes(m.key)); +}; + const searchPeople = (ssbServer, search) => debug("Searching people") || new Promise((resolve, reject) => { @@ -261,10 +292,9 @@ const getAllEntries = (ssbServer, query) => }), pull.collect((err, msgs) => { debug("Done fetching all entries"); - const entries = msgs.map((x) => x.value); if (err) return reject(err); - return resolve(entries); + return resolve(msgs); }) ); }); diff --git a/app/public/js/index.js b/app/public/js/index.js index cd085d6..840bcf0 100644 --- a/app/public/js/index.js +++ b/app/public/js/index.js @@ -25,5 +25,11 @@ messages.forEach((message) => { overlay.addEventListener("click", onClose); closeButton.addEventListener("click", onClose); escCallback = onClose; + + fetch("/vanish", { + method: "POST", + headers: { "Content-Type": "application/x-www-form-urlencoded" }, + body: "key=" + encodeURIComponent(message.dataset.key), + }); }); }); diff --git a/app/public/style.css b/app/public/style.css index b045954..c512ba5 100644 --- a/app/public/style.css +++ b/app/public/style.css @@ -163,6 +163,8 @@ button.vanishing-message { padding: 10px; padding-bottom: 0; font-weight: bold; + text-decoration: none; + color: #000; } .modal-body { diff --git a/app/views/index.ejs b/app/views/index.ejs index acd2e27..92e5f9f 100644 --- a/app/views/index.ejs +++ b/app/views/index.ejs @@ -25,20 +25,20 @@ <% if (vanishingMessages.length > 0) { %>

Vanishing Messages

- <% vanishingMessages.reverse().map(post => { %> + <% vanishingMessages.reverse().map(message => { %> -