Cap Group Admins at 5

This commit is contained in:
Chewbacca
2023-04-04 14:05:08 -04:00
parent b704e476eb
commit 5fa8a21403
6 changed files with 65 additions and 27 deletions

View File

@ -15,10 +15,14 @@ import { useAccount, useBlockGroupMember, useDemoteGroupMember, usePromoteGroupM
import { GroupRoles } from 'soapbox/schemas/group-member';
import toast from 'soapbox/toast';
import { MAX_ADMIN_COUNT } from '../group-members';
import type { Menu as IMenu } from 'soapbox/components/dropdown-menu';
import type { Group, GroupMember } from 'soapbox/types/entities';
const messages = defineMessages({
adminLimitTitle: { id: 'group.member.admin.limit.title', defaultMessage: 'Admin limit reached' },
adminLimitSummary: { id: 'group.member.admin.limit.summary', defaultMessage: 'You can assign up to {count} admins for the group at this time.' },
blockConfirm: { id: 'confirmations.block_from_group.confirm', defaultMessage: 'Ban' },
blockFromGroupHeading: { id: 'confirmations.block_from_group.heading', defaultMessage: 'Ban From Group' },
blockFromGroupMessage: { id: 'confirmations.block_from_group.message', defaultMessage: 'Are you sure you want to ban @{name} from the group?' },
@ -39,10 +43,11 @@ const messages = defineMessages({
interface IGroupMemberListItem {
member: GroupMember
group: Group
canPromoteToAdmin: boolean
}
const GroupMemberListItem = (props: IGroupMemberListItem) => {
const { member, group } = props;
const { canPromoteToAdmin, member, group } = props;
const dispatch = useAppDispatch();
const features = useFeatures();
@ -90,6 +95,13 @@ const GroupMemberListItem = (props: IGroupMemberListItem) => {
};
const handleAdminAssignment = () => {
if (!canPromoteToAdmin) {
toast.error(intl.formatMessage(messages.adminLimitTitle), {
summary: intl.formatMessage(messages.adminLimitSummary, { count: MAX_ADMIN_COUNT }),
});
return;
}
dispatch(openModal('CONFIRM', {
heading: intl.formatMessage(messages.promoteConfirm),
message: intl.formatMessage(messages.promoteConfirmMessage, { name: account?.username }),

View File

@ -3,6 +3,7 @@ import React, { useMemo } from 'react';
import { PendingItemsRow } from 'soapbox/components/pending-items-row';
import ScrollableList from 'soapbox/components/scrollable-list';
import { useFeatures } from 'soapbox/hooks';
import { useGroup } from 'soapbox/hooks/api';
import { useGroupMembershipRequests } from 'soapbox/hooks/api/groups/useGroupMembershipRequests';
import { useGroupMembers } from 'soapbox/hooks/api/useGroupMembers';
@ -18,9 +19,13 @@ interface IGroupMembers {
params: { id: string }
}
export const MAX_ADMIN_COUNT = 5;
const GroupMembers: React.FC<IGroupMembers> = (props) => {
const groupId = props.params.id;
const features = useFeatures();
const { group, isFetching: isFetchingGroup } = useGroup(groupId);
const { groupMembers: owners, isFetching: isFetchingOwners } = useGroupMembers(groupId, GroupRoles.OWNER);
const { groupMembers: admins, isFetching: isFetchingAdmins } = useGroupMembers(groupId, GroupRoles.ADMIN);
@ -35,6 +40,10 @@ const GroupMembers: React.FC<IGroupMembers> = (props) => {
...users,
], [owners, admins, users]);
const canPromoteToAdmin = features.groupsAdminMax
? members.filter((member) => member.role === GroupRoles.ADMIN).length < MAX_ADMIN_COUNT
: true;
return (
<>
<ScrollableList
@ -58,6 +67,7 @@ const GroupMembers: React.FC<IGroupMembers> = (props) => {
group={group as Group}
member={member}
key={member.account.id}
canPromoteToAdmin={canPromoteToAdmin}
/>
))}
</ScrollableList>