From 6fcbabe938d918a6a15797c6ecb5a10ef702a7f9 Mon Sep 17 00:00:00 2001 From: gdjolt8 Date: Sat, 8 Nov 2025 17:49:13 -0500 Subject: [PATCH 1/4] added Approve All Button in Join Requests tab --- .../orgs/org_admin/pages/JoinRequests.tsx | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/modules/stuyactivities/orgs/org_admin/pages/JoinRequests.tsx b/src/modules/stuyactivities/orgs/org_admin/pages/JoinRequests.tsx index a21abfc6..66983913 100644 --- a/src/modules/stuyactivities/orgs/org_admin/pages/JoinRequests.tsx +++ b/src/modules/stuyactivities/orgs/org_admin/pages/JoinRequests.tsx @@ -4,6 +4,9 @@ import OrgContext from "../../../../../contexts/OrgContext"; import PendingMember from "../components/PendingMember"; import { Box } from "@mui/material"; import ItemList from "../../../../../components/ui/lists/ItemList"; +import AsyncButton from "../../../../../components/ui/buttons/AsyncButton"; +import { supabase } from "../../../../../lib/supabaseClient"; +import { enqueueSnackbar } from "notistack"; const JoinRequests = () => { const organization = useContext(OrgContext); @@ -19,6 +22,44 @@ const JoinRequests = () => { }; }); + const handleApproveAll = async () => { + let membersApproved = 0; + pendingMembers.forEach(async (member) => { + const { error } = await supabase.functions.invoke("approve-member", { + body: { member_id: member.membershipId }, + }); + + if (error) { + enqueueSnackbar( + "Error approving member. Contact it@stuysu.org for support.", + { variant: "error" }, + ); + return; + } + + let memberIndex = organization.memberships.findIndex( + (m) => m.id === member.membershipId, + ); + let memberData = organization.memberships[memberIndex]; + + memberData.active = true; + + if (organization.setOrg) { + organization.setOrg({ + ...organization, + memberships: [ + ...organization.memberships.slice(0, memberIndex), + memberData, + ...organization.memberships.slice(memberIndex + 1), + ], + }); + } + membersApproved++; + }); + + if (membersApproved > 0) enqueueSnackbar(`Approved ${membersApproved} members!`, { variant: "success" }); + else enqueueSnackbar("No join requests to approve.", {variant: "info"}); + }; return (
{ When people request to join your Activity, you'll see them here.

+
+ Approve All
{pendingMembers?.length > 0 && ( From 398f774bedc40c16f426a19d7a63308c487d4173 Mon Sep 17 00:00:00 2001 From: gdjolt8 Date: Sun, 9 Nov 2025 18:32:10 -0500 Subject: [PATCH 2/4] fixed issues --- .gitignore | 1 + .../org_admin/components/PendingMember.tsx | 40 ++--------- .../orgs/org_admin/pages/JoinRequests.tsx | 67 ++++++++++--------- 3 files changed, 41 insertions(+), 67 deletions(-) diff --git a/.gitignore b/.gitignore index bd99a0df..12470d66 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ /.pnp .pnp.js +.env # testing /coverage diff --git a/src/modules/stuyactivities/orgs/org_admin/components/PendingMember.tsx b/src/modules/stuyactivities/orgs/org_admin/components/PendingMember.tsx index ef775246..3aec180b 100644 --- a/src/modules/stuyactivities/orgs/org_admin/components/PendingMember.tsx +++ b/src/modules/stuyactivities/orgs/org_admin/components/PendingMember.tsx @@ -12,50 +12,18 @@ const PendingMember = ({ last_name, email, picture, + approveFunc, }: { id: number; first_name?: string; last_name?: string; email: string; picture: string | undefined; + approveFunc: () => void; }) => { const { enqueueSnackbar } = useSnackbar(); const organization = useContext(OrgContext); - - const handleApprove = async () => { - const { error } = await supabase.functions.invoke("approve-member", { - body: { member_id: id }, - }); - - if (error) { - enqueueSnackbar( - "Error approving member. Contact it@stuysu.org for support.", - { variant: "error" }, - ); - return; - } - - let memberIndex = organization.memberships.findIndex( - (m) => m.id === id, - ); - let memberData = organization.memberships[memberIndex]; - - memberData.active = true; - - if (organization.setOrg) { - organization.setOrg({ - ...organization, - memberships: [ - ...organization.memberships.slice(0, memberIndex), - memberData, - ...organization.memberships.slice(memberIndex + 1), - ], - }); - } - - enqueueSnackbar("Member approved!", { variant: "success" }); - }; - + const handleReject = async () => { const { error } = await supabase .from("memberships") @@ -102,7 +70,7 @@ const PendingMember = ({
{approveFunc()})} variant="contained" sx={{ height: "40px" }} > diff --git a/src/modules/stuyactivities/orgs/org_admin/pages/JoinRequests.tsx b/src/modules/stuyactivities/orgs/org_admin/pages/JoinRequests.tsx index 66983913..44264dfc 100644 --- a/src/modules/stuyactivities/orgs/org_admin/pages/JoinRequests.tsx +++ b/src/modules/stuyactivities/orgs/org_admin/pages/JoinRequests.tsx @@ -8,6 +8,39 @@ import AsyncButton from "../../../../../components/ui/buttons/AsyncButton"; import { supabase } from "../../../../../lib/supabaseClient"; import { enqueueSnackbar } from "notistack"; +export const handleApprove = async (id: number, organization: OrgContextType, single: boolean) => { + const { error } = await supabase.functions.invoke("approve-member", { + body: { member_id: id }, + }); + + if (error) { + enqueueSnackbar( + "Error approving member. Contact it@stuysu.org for support.", + { variant: "error" }, + ); + return; + } + + let memberIndex = organization.memberships.findIndex( + (m) => m.id === id, + ); + let memberData = organization.memberships[memberIndex]; + + memberData.active = true; + + if (organization.setOrg) { + organization.setOrg({ + ...organization, + memberships: [ + ...organization.memberships.slice(0, memberIndex), + memberData, + ...organization.memberships.slice(memberIndex + 1), + ], + }); + } + if (single) enqueueSnackbar("Member approved!", { variant: "success" }); +}; + const JoinRequests = () => { const organization = useContext(OrgContext); const pendingMembers = organization.memberships @@ -25,40 +58,11 @@ const JoinRequests = () => { const handleApproveAll = async () => { let membersApproved = 0; pendingMembers.forEach(async (member) => { - const { error } = await supabase.functions.invoke("approve-member", { - body: { member_id: member.membershipId }, - }); - - if (error) { - enqueueSnackbar( - "Error approving member. Contact it@stuysu.org for support.", - { variant: "error" }, - ); - return; - } - - let memberIndex = organization.memberships.findIndex( - (m) => m.id === member.membershipId, - ); - let memberData = organization.memberships[memberIndex]; - - memberData.active = true; - - if (organization.setOrg) { - organization.setOrg({ - ...organization, - memberships: [ - ...organization.memberships.slice(0, memberIndex), - memberData, - ...organization.memberships.slice(memberIndex + 1), - ], - }); - } + handleApprove(member.membershipId!, organization, false); membersApproved++; }); - if (membersApproved > 0) enqueueSnackbar(`Approved ${membersApproved} members!`, { variant: "success" }); - else enqueueSnackbar("No join requests to approve.", {variant: "info"}); + enqueueSnackbar(`Approved ${membersApproved} members`, { variant: "success" }); }; return ( @@ -86,6 +90,7 @@ const JoinRequests = () => { email={member.email || "Undefined"} picture={member.picture} key={i} + approveFunc={(() => {handleApprove(member.membershipId!, organization, true)})} /> ))} From 3e9be24451f6738c54fba379f611ecd489c21f35 Mon Sep 17 00:00:00 2001 From: gdjolt8 Date: Sun, 9 Nov 2025 18:33:20 -0500 Subject: [PATCH 3/4] fixed issues --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 12470d66..bd99a0df 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,6 @@ /.pnp .pnp.js -.env # testing /coverage From 50d81d1326a0b96a2e5b30edce9877938be0ac34 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Sun, 9 Nov 2025 23:35:36 +0000 Subject: [PATCH 4/4] Restyled by whitespace --- .../stuyactivities/orgs/org_admin/components/PendingMember.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/stuyactivities/orgs/org_admin/components/PendingMember.tsx b/src/modules/stuyactivities/orgs/org_admin/components/PendingMember.tsx index 3aec180b..6cad8add 100644 --- a/src/modules/stuyactivities/orgs/org_admin/components/PendingMember.tsx +++ b/src/modules/stuyactivities/orgs/org_admin/components/PendingMember.tsx @@ -23,7 +23,7 @@ const PendingMember = ({ }) => { const { enqueueSnackbar } = useSnackbar(); const organization = useContext(OrgContext); - + const handleReject = async () => { const { error } = await supabase .from("memberships")