diff --git a/app/lib/express.js b/app/lib/express.js index 1e453fc..b24ac57 100644 --- a/app/lib/express.js +++ b/app/lib/express.js @@ -501,9 +501,13 @@ router.get( const communityData = (req) => { const name = req.params.name; - return queries.getCommunityMembers(name).then((members) => ({ + return Promise.all([ + queries.getCommunityMembers(name), + queries.isMember(req.context.profile.id, name), + ]).then(([members, isMember]) => ({ name, members, + isMember, })); }; @@ -558,6 +562,38 @@ router.post("/communities/:name/new", async (req, res) => { res.redirect(`/communities/${name}/${topic.key.replace("%", "")}`); }); +router.post("/communities/:name/join", async (req, res) => { + const name = req.params.name; + + await ssb.client().identities.publishAs({ + id: req.context.profile.id, + private: false, + content: { + type: "channel", + channel: name, + subscribed: true, + }, + }); + + res.redirect(`/communities/${name}`); +}); + +router.post("/communities/:name/leave", async (req, res) => { + const name = req.params.name; + + await ssb.client().identities.publishAs({ + id: req.context.profile.id, + private: false, + content: { + type: "channel", + channel: name, + subscribed: false, + }, + }); + + res.redirect(`/communities/${name}`); +}); + router.post("/communities/:name/:key(*)/publish", async (req, res) => { const name = req.params.name; const key = req.params.key; diff --git a/app/lib/mobile-routes.js b/app/lib/mobile-routes.js index 8bfda6d..f910148 100644 --- a/app/lib/mobile-routes.js +++ b/app/lib/mobile-routes.js @@ -94,13 +94,14 @@ module.exports.setupRoutes = (router) => { async (req, res) => { const name = req.params.name; - const [posts, members] = await Promise.all([ + const [posts, members, isMember] = await Promise.all([ queries.getCommunityPosts(name), queries.getCommunityMembers(name), + queries.isMember(req.context.profile.id, name), ]); res.render("mobile/communities/community", { - community: { name, members }, + community: { name, members, isMember }, posts, layout: "mobile/_layout", }); diff --git a/app/lib/queries.js b/app/lib/queries.js index 6cb23b7..a36b4f1 100644 --- a/app/lib/queries.js +++ b/app/lib/queries.js @@ -8,7 +8,8 @@ const debugPosts = require("debug")("queries:posts"), debugProfile = require("debug")("queries:profile"), debugCommunities = require("debug")("queries:communities"), debugCommunityMembers = require("debug")("queries:communityMembers"), - debugCommunityPosts = require("debug")("queries:communityPosts"); + debugCommunityPosts = require("debug")("queries:communityPosts"), + debugCommunityIsMember = require("debug")("queries:communityIsMember"); const paramap = require("pull-paramap"); const { promisePull, mapValues } = require("./utils"); const ssb = require("./ssb-client"); @@ -450,6 +451,32 @@ const getCommunities = async () => { return communities; }; +const isMember = async (id, channel) => { + debugCommunityIsMember("Fetching"); + const [lastSubscription] = await promisePull( + ssb.client().query.read({ + reverse: true, + limit: 1, + query: [ + { + $filter: { + value: { + author: id, + content: { + type: "channel", + channel: channel, + }, + }, + }, + }, + ], + }) + ); + debugCommunityIsMember("Done"); + + return lastSubscription && lastSubscription.value.content.subscribed; +}; + const getCommunityMembers = async (name) => { debugCommunityMembers("Fetching"); @@ -472,10 +499,22 @@ const getCommunityMembers = async (name) => { }), paramap(mapProfiles) ); + const dedupMembers = {}; + for (const member of communityMembers) { + const author = member.value.author; + if (dedupMembers[author]) continue; + dedupMembers[author] = member; + } + const onlySubscribedMembers = Object.values(dedupMembers).filter( + (x) => x.value.content.subscribed + ); + const memberProfiles = onlySubscribedMembers.map( + (x) => x.value.authorProfile + ); debugCommunityMembers("Done"); - return communityMembers.map((x) => x.value.authorProfile); + return memberProfiles; }; const getPostWithReplies = async (channel, key) => { @@ -611,4 +650,5 @@ module.exports = { getPostWithReplies, progress, autofollow, + isMember, }; diff --git a/app/views/communities/_layout.ejs b/app/views/communities/_layout.ejs index c5f93db..572d21b 100644 --- a/app/views/communities/_layout.ejs +++ b/app/views/communities/_layout.ejs @@ -6,8 +6,8 @@ } -
-
+
+

#<%= community.name %> @@ -19,7 +19,12 @@