diff --git a/web/modals/threads/members/members-modal.react.js b/web/modals/threads/members/members-modal.react.js --- a/web/modals/threads/members/members-modal.react.js +++ b/web/modals/threads/members/members-modal.react.js @@ -3,6 +3,7 @@ import * as React from 'react'; import { useModalContext } from 'lib/components/modal-provider.react.js'; +import { primaryInviteLinksSelector } from 'lib/selectors/invite-links-selectors.js'; import { useUserSearchIndex } from 'lib/selectors/nav-selectors.js'; import { threadInfoSelector } from 'lib/selectors/thread-selectors.js'; import { @@ -11,6 +12,7 @@ } from 'lib/shared/thread-utils.js'; import type { RelativeMemberInfo } from 'lib/types/minimally-encoded-thread-permissions-types.js'; import { threadPermissions } from 'lib/types/thread-permission-types.js'; +import { threadTypeIsCommunityRoot } from 'lib/types/thread-types-enum.js'; import { useRolesFromCommunityThreadInfo } from 'lib/utils/role-utils.js'; import { AddMembersModal } from './add-members-modal.react.js'; @@ -18,6 +20,8 @@ import css from './members-modal.css'; import Button from '../../../components/button.react.js'; import Tabs, { type TabData } from '../../../components/tabs.react.js'; +import ManageInviteLinksModal from '../../../invite-links/manage-invite-links-modal.react.js'; +import ViewInviteLinkModal from '../../../invite-links/view-invite-link-modal.react.js'; import { useSelector } from '../../../redux/redux-utils.js'; import SearchModal from '../../search-modal.react.js'; @@ -117,15 +121,38 @@ const threadInfo = useSelector(state => threadInfoSelector(state)[threadID]); - const onClickAddMembers = React.useCallback(() => { - pushModal(); - }, [popModal, pushModal, threadID]); - - const canAddMembers = useThreadHasPermission( + const inviteLink = useSelector(primaryInviteLinksSelector)[threadID]; + const canManageLinks = useThreadHasPermission( threadInfo, - threadPermissions.ADD_MEMBERS, + threadPermissions.MANAGE_INVITE_LINKS, ); + const isCommunityRoot = threadTypeIsCommunityRoot(threadInfo.type); + + const onClickAddMembers = React.useCallback(() => { + if (!isCommunityRoot) { + pushModal(); + } else if (inviteLink) { + pushModal(); + } else if (canManageLinks) { + pushModal(); + } + }, [ + canManageLinks, + inviteLink, + isCommunityRoot, + popModal, + pushModal, + threadID, + ]); + + const canAddMembersViaInviteLink = + isCommunityRoot && (inviteLink || canManageLinks); + + const canAddMembers = + useThreadHasPermission(threadInfo, threadPermissions.ADD_MEMBERS) || + canAddMembersViaInviteLink; + const addMembersButton = React.useMemo(() => { if (!canAddMembers) { return null;