diff --git a/apps/builddao/widget/components/buttons/JoinNow.jsx b/apps/builddao/widget/components/buttons/JoinNow.jsx
index 27ba3914..12a4cb79 100644
--- a/apps/builddao/widget/components/buttons/JoinNow.jsx
+++ b/apps/builddao/widget/components/buttons/JoinNow.jsx
@@ -1,40 +1,10 @@
-const daoId = "build.sputnik-dao.near";
-const accountId = context.accountId;
-const alreadyJoinedRolesNames = ["community", "council"];
-const searchRange = 100;
-
-const policy = Near.view(daoId, "get_policy");
-
-const lastProposalId = Near.view(daoId, "get_last_proposal_id") - 1;
-
-const lastProposals = Near.view(daoId, "get_proposals", {
- from_index: lastProposalId - searchRange,
- limit: searchRange,
-}) || [];
-
-const alreadyMadeAProposal =
- lastProposals.filter((proposal) => {
- return proposal.proposer === accountId;
- }).length > 0;
-
-if (policy === null) {
- return "";
-}
-
-const deposit = policy.proposal_bond;
-
-const group = policy.roles
- .filter((role) => alreadyJoinedRolesNames.includes(role.name))
- .map((role) => {
- return role.kind.Group;
- });
-
-const accounts = new Set(group[0].concat(group[1]));
+const { checkIsMemberOrPending } = VM.require(
+ "buildhub.near/widget/core.lib.common"
+);
-const isCommunityOrCouncilMember = accounts.has(accountId);
+checkIsMemberOrPending || (checkIsMemberOrPending = () => {});
-const canJoin =
- (accountId && !isCommunityOrCouncilMember )|| (accountId && !alreadyMadeAProposal);
+const isMemberOrPending = checkIsMemberOrPending(context.accountId);
const Button = styled.a`
width: max-content;
@@ -83,6 +53,10 @@ const Container = styled.div`
return (
- {canJoin ? : props.children}
+ {!isMemberOrPending ? (
+
+ ) : (
+ props.children
+ )}
);
diff --git a/apps/builddao/widget/core/lib/common.js b/apps/builddao/widget/core/lib/common.js
new file mode 100644
index 00000000..96bb4082
--- /dev/null
+++ b/apps/builddao/widget/core/lib/common.js
@@ -0,0 +1,37 @@
+// checks if the user is already dao's community/council member or has an active proposal
+const checkIsMemberOrPending = (accountId) => {
+ const daoId = "build.sputnik-dao.near";
+ if (!accountId) {
+ return false;
+ }
+ const alreadyJoinedRolesNames = ["community", "council"];
+ const searchRange = 100;
+
+ const lastProposalId = Near.view(daoId, "get_last_proposal_id");
+
+ const policy = Near.view(daoId, "get_policy");
+ const isDaoMember = false;
+ const lastProposals =
+ Near.view(daoId, "get_proposals", {
+ from_index: lastProposalId - searchRange,
+ limit: searchRange
+ }) || [];
+
+ const alreadyMadeAProposal =
+ lastProposals.filter((proposal) => {
+ return (
+ proposal.proposer === accountId && proposal.status === "InProgress"
+ );
+ }).length > 0;
+
+ policy.roles
+ .filter((role) => alreadyJoinedRolesNames.includes(role.name))
+ .map((role) => {
+ if (Array.isArray(role.kind.Group) && !isDaoMember) {
+ isDaoMember = role.kind.Group.includes(accountId);
+ }
+ });
+ return isDaoMember || alreadyMadeAProposal;
+};
+
+return { checkIsMemberOrPending };
diff --git a/apps/builddao/widget/section/cta.jsx b/apps/builddao/widget/section/cta.jsx
index 63c03111..4665c7c6 100644
--- a/apps/builddao/widget/section/cta.jsx
+++ b/apps/builddao/widget/section/cta.jsx
@@ -1,3 +1,11 @@
+const { checkIsMemberOrPending } = VM.require(
+ "buildhub.near/widget/core.lib.common"
+);
+
+checkIsMemberOrPending || (checkIsMemberOrPending = () => {});
+
+const isMemberOrPending = checkIsMemberOrPending(context.accountId);
+
const logoLink =
"https://ipfs.near.social/ipfs/bafkreihbwho3qfvnu4yss3eh5jrx6uxhrlzdgtdjyzyjrpa6odro6wdxya";
const gridLink =
@@ -133,7 +141,7 @@ return (
Together, we can build a better future.
- Join Now
+ {!isMemberOrPending && Join Now}
diff --git a/apps/builddao/widget/section/join.jsx b/apps/builddao/widget/section/join.jsx
index 6e3d8b54..dbf97c64 100644
--- a/apps/builddao/widget/section/join.jsx
+++ b/apps/builddao/widget/section/join.jsx
@@ -1,3 +1,11 @@
+const { checkIsMemberOrPending } = VM.require(
+ "buildhub.near/widget/core.lib.common"
+);
+
+checkIsMemberOrPending || (checkIsMemberOrPending = () => {});
+
+const isMemberOrPending = checkIsMemberOrPending(context.accountId);
+
const SectionPill = ({ title, icon }) => {
const Pill = styled.div`
display: flex;
@@ -356,7 +364,7 @@ return (
3. Fulfill contribution requirements
- Join Now
+ {!isMemberOrPending && Join Now}