From 76024926e8b4d7b8aacf2bea0ee7c29a12a8ecff Mon Sep 17 00:00:00 2001 From: Dylan Staley <88163+dstaley@users.noreply.github.com> Date: Mon, 16 Mar 2026 11:51:00 -0500 Subject: [PATCH 1/3] feat(ui): Disable invite button when over maxAllowedMemberships --- packages/localizations/src/en-US.ts | 3 +- .../OrganizationProfile/MembersActions.tsx | 57 +++++++++++++++---- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts index 95d14949135..d8d855dc008 100644 --- a/packages/localizations/src/en-US.ts +++ b/packages/localizations/src/en-US.ts @@ -1037,7 +1037,8 @@ export const enUS: LocalizationResource = { organization_domain_blocked: undefined, organization_domain_common: undefined, organization_domain_exists_for_enterprise_connection: undefined, - organization_membership_quota_exceeded: undefined, + organization_membership_quota_exceeded: + 'You have reached your limit of organisation memberships, including outstanding invitations.', organization_minimum_permissions_needed: undefined, organization_not_found_or_unauthorized: 'You are no longer a member of this organization. Please choose or create another one.', diff --git a/packages/ui/src/components/OrganizationProfile/MembersActions.tsx b/packages/ui/src/components/OrganizationProfile/MembersActions.tsx index c4fe5caf852..d1565036cd0 100644 --- a/packages/ui/src/components/OrganizationProfile/MembersActions.tsx +++ b/packages/ui/src/components/OrganizationProfile/MembersActions.tsx @@ -1,4 +1,7 @@ +import { useMemo } from 'react'; +import { useOrganization } from '@clerk/shared/react'; import { Animated } from '@/ui/elements/Animated'; +import { Tooltip } from '@/ui/elements/Tooltip'; import { useProtect } from '../../common'; import { Button, descriptors, Flex, localizationKeys } from '../../customizables'; @@ -11,6 +14,47 @@ type MembersActionsRowProps = { export const MembersActionsRow = ({ actionSlot }: MembersActionsRowProps) => { const canManageMemberships = useProtect({ permission: 'org:sys_memberships:manage' }); + const { organization } = useOrganization(); + + const isBelowLimit = useMemo(() => { + if (!organization) { + return false; + } + + if (organization.maxAllowedMemberships === 0) { + return true; + } + + return organization.membersCount + organization.pendingInvitationsCount < organization.maxAllowedMemberships; + }, [organization]); + + const inviteButton = ( +