diff --git a/apps/cory/index.json b/apps/cory/index.json index c82b771a..9409403a 100644 --- a/apps/cory/index.json +++ b/apps/cory/index.json @@ -1 +1 @@ -{"type":"tildefriends-app","files":{"app.js":"&og7bNeqxTfUqVTdtPsrJTjirJxyE3xDQYp0Pj7KmL2U=.sha256","index.html":"&dyJyLJJqx+qcGXY9CYLY6Jxj/T/ZK+Z8ARa8MhLVhJI=.sha256","vue-material.js":"&K5cdLqXYCENPak/TCINHQhyJhpS4G9DlZHGwoh/LF2g=.sha256","tf-user.js":"&EuejzX/iNHsGkscTHJHeJ8YXukGb31KE8YGUMonXJB0=.sha256","tf-message.js":"&oQggZN26PtRi4Ce9HY8TKVJ9jRrYWLRE5tN+3yHwEJE=.sha256","tf.js":"&27+G0/I9PyIu7zl2yk8jesy6uEI1ZJlax0u5enVDdUw=.sha256","commonmark.min.js":"&5x6ek3tFrKTZX6hXNNyFsjmhvrjmWpUkwuuaiyVV1Us=.sha256","vue.js":"&g1wvA+yHl1sVC+eufTsg9If7ZeVyMTBU+h0tks7ZNzE=.sha256","vue-material-theme-default-dark.css":"&RP2nr+2CR18BpHHw5ST9a5GJUCOG9n0G2kuGkcQioWE=.sha256","vue-material.min.css":"&kGbUM2QgFSyHZRzqQb0b+0S3EVIlZ0AXpdiAVjIhou8=.sha256","roboto.css":"&jJv43Om673mQO5JK0jj7714s5E+5Yrf82H6LcDx7wUs=.sha256","material-icons.css":"&a28PdcVvgq/DxyIvJAx/e+ZOEtOuHnr3kjLWKyzH11M=.sha256"}} \ No newline at end of file +{"type":"tildefriends-app","files":{"app.js":"&l8lBRLBokCaXK/v4sF5qMgQHGqizkMjY8ady4FYaD0U=.sha256","index.html":"&ayK1muTik0h4UYNvT0QNm0WrygVrL8kxBoEyrQkHyHs=.sha256","vue-material.js":"&K5cdLqXYCENPak/TCINHQhyJhpS4G9DlZHGwoh/LF2g=.sha256","tf-user.js":"&fXhPpneuYuseoaYk25ODN3QecFAeOfuMOZd98OgvjsQ=.sha256","tf-message.js":"&oQggZN26PtRi4Ce9HY8TKVJ9jRrYWLRE5tN+3yHwEJE=.sha256","tf.js":"&EgrrFfINhqFL/Kj8qkJwH/DHTLrZ8CxhHDBxZjcyjUY=.sha256","commonmark.min.js":"&5x6ek3tFrKTZX6hXNNyFsjmhvrjmWpUkwuuaiyVV1Us=.sha256","vue.js":"&g1wvA+yHl1sVC+eufTsg9If7ZeVyMTBU+h0tks7ZNzE=.sha256","vue-material-theme-default-dark.css":"&RP2nr+2CR18BpHHw5ST9a5GJUCOG9n0G2kuGkcQioWE=.sha256","vue-material.min.css":"&kGbUM2QgFSyHZRzqQb0b+0S3EVIlZ0AXpdiAVjIhou8=.sha256","roboto.css":"&jJv43Om673mQO5JK0jj7714s5E+5Yrf82H6LcDx7wUs=.sha256","material-icons.css":"&a28PdcVvgq/DxyIvJAx/e+ZOEtOuHnr3kjLWKyzH11M=.sha256"}} \ No newline at end of file diff --git a/apps/cory/index/app.js b/apps/cory/index/app.js index 73c64185..3a3d76cf 100644 --- a/apps/cory/index/app.js +++ b/apps/cory/index/app.js @@ -3,6 +3,8 @@ const k_posts_max = 20; const k_votes_max = 20; +var g_selected = null; + var g_following_cache = {}; var g_followers_cache = {}; var g_following_deep_cache = {}; @@ -171,6 +173,13 @@ async function getRecentPostIds(db, id, ids, limit) { } f.rowid = row_id_max; f.recent = [].concat(recent, f.recent); + var have = {}; + f.recent = f.recent.filter(function(x) { + if (!have[x.id]) { + have[x.id] = true; + return true; + } + }); f.recent.sort((x, y) => y.timestamp - x.timestamp); f.recent = f.recent.slice(0, limit); var j = JSON.stringify(f); @@ -231,7 +240,7 @@ async function getPosts(db, ids) { } async function ready() { - return refresh(); + return refresh(g_selected); } ssb.addEventListener('broadcasts', async function() { @@ -243,51 +252,55 @@ core.register('onConnectionsChanged', async function() { await app.postMessage({connections: connections}); }); -async function refresh() { +async function refresh(selected) { g_following_cache = {}; g_followers_cache = {}; g_following_deep_cache = {}; await app.postMessage({clear: true}); var whoami = await ssb.whoami(); var db = await database("ssb"); + var all_followed = await followingDeep(db, [whoami], 2); + if (selected) { + g_selected = selected; + } else { + g_selected = all_followed; + } await Promise.all([ app.postMessage({whoami: whoami}), - app.postMessage({broadcasts: await ssb.getBroadcasts()}), - app.postMessage({connections: await ssb.connections()}), - app.postMessage({apps: await core.apps()}), - followingDeep(db, [whoami], 2).then(function(f) { - return getRecentPostIds(db, whoami, [].concat([whoami], f), k_posts_max).then(async function(ids) { - var posts = await getPosts(db, ids); - var roots = posts.map(function(x) { - try { - return JSON.parse(x.content).root; - } catch { - return null; - } - }); - roots = roots.filter(function(root) { - return root && posts.every(post => post.id != root); - }); - var all_posts = [].concat(posts, await getPosts(db, roots)); - await Promise.all(all_posts.map(x => app.postMessage({message: x}))); - return Promise.all([].concat(f.map(function(id) { - return [ - getVotes(db, id).then(function(votes) { - return app.postMessage({votes: votes}); - }), - getAbout(db, id).then(function(user) { - return app.postMessage({user: {user: id, about: user}}); - }), - following(db, id).then(function(following) { - return app.postMessage({following: {id: id, users: following}}); - }), - followers(db, id).then(function(followers) { - return app.postMessage({followers: {id: id, users: followers}}); - }), - ]; - }))); + ssb.getBroadcasts().then(broadcasts => app.postMessage({broadcasts: broadcasts})), + ssb.connections().then(connections => app.postMessage({connections: connections})), + core.apps().then(apps => app.postMessage({apps: apps})), + getRecentPostIds(db, whoami, g_selected, k_posts_max).then(async function(ids) { + var posts = await getPosts(db, ids); + var roots = posts.map(function(x) { + try { + return JSON.parse(x.content).root; + } catch { + return null; + } }); + roots = roots.filter(function(root) { + return root && posts.every(post => post.id != root); + }); + var all_posts = [].concat(posts, await getPosts(db, roots)); + return Promise.all(all_posts.map(x => app.postMessage({message: x}))); }), + Promise.all([].concat(all_followed.map(function(id) { + return [ + getVotes(db, id).then(function(votes) { + return app.postMessage({votes: votes}); + }), + getAbout(db, id).then(function(user) { + return app.postMessage({user: {user: id, about: user}}); + }), + following(db, id).then(function(following) { + return app.postMessage({following: {id: id, users: following}}); + }), + followers(db, id).then(function(followers) { + return app.postMessage({followers: {id: id, users: followers}}); + }), + ]; + }))), ]); } @@ -304,6 +317,7 @@ ssb.addEventListener('message', async function(id) { }); core.register('message', async function(m) { + print(JSON.stringify(m)); if (m.message == 'ready') { await ready(); } else if (m.message) { @@ -312,7 +326,13 @@ core.register('message', async function(m) { } else if (m.message.appendMessage) { await ssb.appendMessage(m.message.appendMessage); } else if (m.message.refresh) { - await refresh(); + await refresh(g_selected); + } + } else if (m.event == 'hashChange') { + if (m.hash.length > 1) { + refresh([m.hash.substring(1)]); + } else { + refresh(); } } else if (m.event == 'focus' || m.event == 'blur') { /* Shh. */ diff --git a/apps/cory/index/index.html b/apps/cory/index/index.html index 716b7f07..23c89748 100644 --- a/apps/cory/index/index.html +++ b/apps/cory/index/index.html @@ -39,7 +39,7 @@ Connect Users - + @@ -74,12 +74,18 @@ Submit Post - + + + + + diff --git a/apps/cory/index/tf-user.js b/apps/cory/index/tf-user.js index 8accc15f..0b45b5b6 100644 --- a/apps/cory/index/tf-user.js +++ b/apps/cory/index/tf-user.js @@ -12,6 +12,7 @@ Vue.component('tf-user', { get: function() { return g_data.users && g_data.users[g_data.whoami] && + g_data.users[g_data.whoami].following && g_data.users[g_data.whoami].following[this.id]; }, set: function(newValue) { @@ -45,7 +46,7 @@ Vue.component('tf-user', { window.parent.postMessage(message, '*'); }, show_user: function() { - this.show_user_dialog = true; + window.parent.postMessage({action: 'setHash', hash: this.id}, '*'); if (this.id == this.whoami) { this.edit_profile_name = this.users[this.id].name; this.edit_profile_description = this.users[this.id].description; diff --git a/apps/cory/index/tf.js b/apps/cory/index/tf.js index c44c7d64..5b5e2736 100644 --- a/apps/cory/index/tf.js +++ b/apps/cory/index/tf.js @@ -15,6 +15,7 @@ var g_data = { reply_branch: null, mentions: {}, unread: 0, + loading: true, }; var g_data_initial = JSON.parse(JSON.stringify(g_data)); @@ -94,11 +95,16 @@ function processMessages() { g_data.votes[link][content.vote.expression].push({author: vote.author, value: content.vote.value}); }); } else if (key == 'clear') { + g_data.loading = true; Object.keys(g_data_initial).forEach(function(key) { Vue.set(g_data, key, JSON.parse(JSON.stringify(g_data_initial[key]))); }); + } else if (key == 'ready') { + g_data.loading = false; } else if (key == 'unread') { g_data.unread += event.data.unread; + } else if (key == 'hash') { + console.log(event.data); } else { g_data[key] = event.data[key]; } @@ -114,6 +120,7 @@ window.addEventListener('message', function(event) { setTimeout(processMessages, 250); } }); + window.addEventListener('load', function() { Vue.use(VueMaterial.default); var vue = new Vue({ diff --git a/core/client.js b/core/client.js index a99ddb69..fec464d6 100644 --- a/core/client.js +++ b/core/client.js @@ -103,7 +103,6 @@ function trace() { request.addEventListener("loadend", function() { if (request.status == 200) { /* The trace is loaded. */ - console.log(typeof(request.response)); var perfetto = window.open('/perfetto/'); var done = false; if (perfetto) { @@ -589,6 +588,8 @@ function message(event) { var iframe = document.getElementById("iframe_" + event.data.name); iframe.setAttribute("width", event.data.width); iframe.setAttribute("height", event.data.height); + } else if (event.data && event.data.action == "setHash") { + window.location.hash = event.data.hash; } else { send({event: "message", message: event.data}); }