import React from 'react'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; import Account from 'soapbox/components/account'; import { AuthorizeRejectButtons } from 'soapbox/components/authorize-reject-buttons'; import ScrollableList from 'soapbox/components/scrollable-list'; import { Column, HStack, Spinner } from 'soapbox/components/ui'; import { useGroup } from 'soapbox/hooks'; import { useGroupMembershipRequests } from 'soapbox/hooks/api/groups/useGroupMembershipRequests'; import toast from 'soapbox/toast'; import ColumnForbidden from '../ui/components/column-forbidden'; import type { Account as AccountEntity } from 'soapbox/schemas'; type RouteParams = { id: string }; const messages = defineMessages({ heading: { id: 'column.group_pending_requests', defaultMessage: 'Pending requests' }, authorize: { id: 'group.group_mod_authorize', defaultMessage: 'Accept' }, authorized: { id: 'group.group_mod_authorize.success', defaultMessage: 'Accepted @{name} to group' }, authorizeFail: { id: 'group.group_mod_authorize.fail', defaultMessage: 'Failed to approve @{name}' }, reject: { id: 'group.group_mod_reject', defaultMessage: 'Reject' }, rejected: { id: 'group.group_mod_reject.success', defaultMessage: 'Rejected @{name} from group' }, rejectFail: { id: 'group.group_mod_reject.fail', defaultMessage: 'Failed to reject @{name}' }, }); interface IMembershipRequest { account: AccountEntity onAuthorize(accountId: string): Promise onReject(accountId: string): Promise } const MembershipRequest: React.FC = ({ account, onAuthorize, onReject }) => { const intl = useIntl(); if (!account) return null; function handleAuthorize(accountId: string) { return onAuthorize(accountId) .catch(() => toast.error(intl.formatMessage(messages.authorizeFail, { name: account.username }))); } function handleReject(accountId: string) { return onReject(accountId) .catch(() => toast.error(intl.formatMessage(messages.rejectFail, { name: account.username }))); } return (
); }; interface IGroupMembershipRequests { params: RouteParams } const GroupMembershipRequests: React.FC = ({ params }) => { const intl = useIntl(); const id = params?.id; const { group } = useGroup(id); const { accounts, isLoading, authorize, reject } = useGroupMembershipRequests(id); if (!group || !group.relationship || isLoading) { return ( ); } if (!group.relationship.role || !['owner', 'admin', 'moderator'].includes(group.relationship.role)) { return (); } const handleAuthorize = (accountId: string) => authorize(accountId); const handleReject = (accountId: string) => reject(accountId); return ( } > {accounts.map((account) => ( ))} ); }; export default GroupMembershipRequests;