Skip to content

Commit e396462

Browse files
feat(sub): hide usage limits and seats info from enterprise members (non-admin) (#3243)
- Add isEnterpriseMember and canViewUsageInfo flags to subscription permissions - Hide UsageHeader, CreditBalance, billing date, and usage notifications from enterprise members - Show only plan name in subscription tab for enterprise members (non-admin) - Hide usage indicator details (amount, progress pills) from enterprise members - Team tab already hidden via requiresTeam check in settings modal Closes #6882 Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Emir Karabeg <emir-karabeg@users.noreply.github.com>
1 parent 7c7c0fd commit e396462

File tree

3 files changed

+104
-71
lines changed

3 files changed

+104
-71
lines changed

apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/subscription-permissions.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ export interface SubscriptionPermissions {
77
canCancelSubscription: boolean
88
showTeamMemberView: boolean
99
showUpgradePlans: boolean
10+
isEnterpriseMember: boolean
11+
canViewUsageInfo: boolean
1012
}
1113

1214
export interface SubscriptionState {
@@ -31,6 +33,9 @@ export function getSubscriptionPermissions(
3133
const { isFree, isPro, isTeam, isEnterprise, isPaid } = subscription
3234
const { isTeamAdmin } = userRole
3335

36+
const isEnterpriseMember = isEnterprise && !isTeamAdmin
37+
const canViewUsageInfo = !isEnterpriseMember
38+
3439
return {
3540
canUpgradeToPro: isFree,
3641
canUpgradeToTeam: isFree || (isPro && !isTeam),
@@ -40,6 +45,8 @@ export function getSubscriptionPermissions(
4045
canCancelSubscription: isPaid && !isEnterprise && !(isTeam && !isTeamAdmin), // Team members can't cancel
4146
showTeamMemberView: isTeam && !isTeamAdmin,
4247
showUpgradePlans: isFree || (isPro && !isTeam) || (isTeam && isTeamAdmin), // Free users, Pro users, Team owners see plans
48+
isEnterpriseMember,
49+
canViewUsageInfo,
4350
}
4451
}
4552

apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/subscription.tsx

Lines changed: 84 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -300,12 +300,16 @@ export function Subscription() {
300300
)
301301

302302
const showBadge =
303-
(permissions.canEditUsageLimit && !permissions.showTeamMemberView) ||
304-
permissions.showTeamMemberView ||
305-
subscription.isEnterprise ||
306-
isBlocked
303+
!permissions.isEnterpriseMember &&
304+
((permissions.canEditUsageLimit && !permissions.showTeamMemberView) ||
305+
permissions.showTeamMemberView ||
306+
subscription.isEnterprise ||
307+
isBlocked)
307308

308309
const getBadgeConfig = (): { text: string; variant: 'blue-secondary' | 'red' } => {
310+
if (permissions.isEnterpriseMember) {
311+
return { text: '', variant: 'blue-secondary' }
312+
}
309313
if (permissions.showTeamMemberView || subscription.isEnterprise) {
310314
return { text: `${subscription.seats} seats`, variant: 'blue-secondary' }
311315
}
@@ -443,67 +447,75 @@ export function Subscription() {
443447

444448
return (
445449
<div className='flex h-full flex-col gap-[20px]'>
446-
{/* Current Plan & Usage Overview */}
447-
<UsageHeader
448-
title={formatPlanName(subscription.plan)}
449-
showBadge={showBadge}
450-
badgeText={badgeConfig.text}
451-
badgeVariant={badgeConfig.variant}
452-
onBadgeClick={permissions.showTeamMemberView ? undefined : handleBadgeClick}
453-
seatsText={
454-
permissions.canManageTeam || subscription.isEnterprise
455-
? `${subscription.seats} seats`
456-
: undefined
457-
}
458-
current={usage.current}
459-
limit={
460-
subscription.isEnterprise || subscription.isTeam
461-
? organizationBillingData?.data?.totalUsageLimit
462-
: !subscription.isFree &&
463-
(permissions.canEditUsageLimit || permissions.showTeamMemberView)
464-
? usage.current // placeholder; rightContent will render UsageLimit
465-
: usage.limit
466-
}
467-
isBlocked={isBlocked}
468-
progressValue={Math.min(usage.percentUsed, 100)}
469-
rightContent={
470-
!subscription.isFree &&
471-
(permissions.canEditUsageLimit || permissions.showTeamMemberView) ? (
472-
<UsageLimit
473-
ref={usageLimitRef}
474-
currentLimit={
475-
(subscription.isTeam || subscription.isEnterprise) &&
476-
isTeamAdmin &&
477-
organizationBillingData?.data
478-
? organizationBillingData.data.totalUsageLimit
479-
: usageLimitData.currentLimit || usage.limit
480-
}
481-
currentUsage={usage.current}
482-
canEdit={permissions.canEditUsageLimit}
483-
minimumLimit={
484-
(subscription.isTeam || subscription.isEnterprise) &&
485-
isTeamAdmin &&
486-
organizationBillingData?.data
487-
? organizationBillingData.data.minimumBillingAmount
488-
: usageLimitData.minimumLimit || (subscription.isPro ? 20 : 40)
489-
}
490-
context={
491-
(subscription.isTeam || subscription.isEnterprise) && isTeamAdmin
492-
? 'organization'
493-
: 'user'
494-
}
495-
organizationId={
496-
(subscription.isTeam || subscription.isEnterprise) && isTeamAdmin
497-
? activeOrgId
498-
: undefined
499-
}
500-
onLimitUpdated={() => {
501-
logger.info('Usage limit updated')
502-
}}
503-
/>
504-
) : undefined
505-
}
506-
/>
450+
{/* Current Plan & Usage Overview - hidden from enterprise members (non-admin) */}
451+
{permissions.canViewUsageInfo ? (
452+
<UsageHeader
453+
title={formatPlanName(subscription.plan)}
454+
showBadge={showBadge}
455+
badgeText={badgeConfig.text}
456+
badgeVariant={badgeConfig.variant}
457+
onBadgeClick={permissions.showTeamMemberView ? undefined : handleBadgeClick}
458+
seatsText={
459+
permissions.canManageTeam || subscription.isEnterprise
460+
? `${subscription.seats} seats`
461+
: undefined
462+
}
463+
current={usage.current}
464+
limit={
465+
subscription.isEnterprise || subscription.isTeam
466+
? organizationBillingData?.data?.totalUsageLimit
467+
: !subscription.isFree &&
468+
(permissions.canEditUsageLimit || permissions.showTeamMemberView)
469+
? usage.current // placeholder; rightContent will render UsageLimit
470+
: usage.limit
471+
}
472+
isBlocked={isBlocked}
473+
progressValue={Math.min(usage.percentUsed, 100)}
474+
rightContent={
475+
!subscription.isFree &&
476+
(permissions.canEditUsageLimit || permissions.showTeamMemberView) ? (
477+
<UsageLimit
478+
ref={usageLimitRef}
479+
currentLimit={
480+
(subscription.isTeam || subscription.isEnterprise) &&
481+
isTeamAdmin &&
482+
organizationBillingData?.data
483+
? organizationBillingData.data.totalUsageLimit
484+
: usageLimitData.currentLimit || usage.limit
485+
}
486+
currentUsage={usage.current}
487+
canEdit={permissions.canEditUsageLimit}
488+
minimumLimit={
489+
(subscription.isTeam || subscription.isEnterprise) &&
490+
isTeamAdmin &&
491+
organizationBillingData?.data
492+
? organizationBillingData.data.minimumBillingAmount
493+
: usageLimitData.minimumLimit || (subscription.isPro ? 20 : 40)
494+
}
495+
context={
496+
(subscription.isTeam || subscription.isEnterprise) && isTeamAdmin
497+
? 'organization'
498+
: 'user'
499+
}
500+
organizationId={
501+
(subscription.isTeam || subscription.isEnterprise) && isTeamAdmin
502+
? activeOrgId
503+
: undefined
504+
}
505+
onLimitUpdated={() => {
506+
logger.info('Usage limit updated')
507+
}}
508+
/>
509+
) : undefined
510+
}
511+
/>
512+
) : (
513+
<div className='flex items-center'>
514+
<span className='font-medium text-[14px] text-[var(--text-primary)]'>
515+
{formatPlanName(subscription.plan)}
516+
</span>
517+
</div>
518+
)}
507519

508520
{/* Upgrade Plans */}
509521
{permissions.showUpgradePlans && (
@@ -539,8 +551,8 @@ export function Subscription() {
539551
</div>
540552
)}
541553

542-
{/* Credit Balance */}
543-
{subscription.isPaid && (
554+
{/* Credit Balance - hidden from enterprise members (non-admin) */}
555+
{subscription.isPaid && permissions.canViewUsageInfo && (
544556
<CreditBalance
545557
balance={subscriptionData?.data?.creditBalance ?? 0}
546558
canPurchase={permissions.canEditUsageLimit}
@@ -554,10 +566,11 @@ export function Subscription() {
554566
<ReferralCode onRedeemComplete={() => refetchSubscription()} />
555567
)}
556568

557-
{/* Next Billing Date - hidden from team members */}
569+
{/* Next Billing Date - hidden from team members and enterprise members (non-admin) */}
558570
{subscription.isPaid &&
559571
subscriptionData?.data?.periodEnd &&
560-
!permissions.showTeamMemberView && (
572+
!permissions.showTeamMemberView &&
573+
!permissions.isEnterpriseMember && (
561574
<div className='flex items-center justify-between'>
562575
<Label>Next Billing Date</Label>
563576
<span className='text-[12px] text-[var(--text-secondary)]'>
@@ -566,8 +579,8 @@ export function Subscription() {
566579
</div>
567580
)}
568581

569-
{/* Usage notifications */}
570-
{subscription.isPaid && <BillingUsageNotificationsToggle />}
582+
{/* Usage notifications - hidden from enterprise members (non-admin) */}
583+
{subscription.isPaid && permissions.canViewUsageInfo && <BillingUsageNotificationsToggle />}
571584

572585
{/* Cancel Subscription */}
573586
{permissions.canCancelSubscription && (

apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/usage-indicator/usage-indicator.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ export function UsageIndicator({ onClick }: UsageIndicatorProps) {
285285
const isPro = planType === 'pro'
286286
const isTeam = planType === 'team'
287287
const isEnterprise = planType === 'enterprise'
288+
const isEnterpriseMember = isEnterprise && !userCanManageBilling
288289

289290
const handleUpgradeToPro = useCallback(async () => {
290291
try {
@@ -463,6 +464,18 @@ export function UsageIndicator({ onClick }: UsageIndicatorProps) {
463464
}
464465
}
465466

467+
if (isEnterpriseMember) {
468+
return (
469+
<div className='flex flex-shrink-0 flex-col border-t px-[13.5px] pt-[8px] pb-[10px]'>
470+
<div className='flex h-[18px] items-center'>
471+
<span className='font-medium text-[12px] text-[var(--text-primary)]'>
472+
{PLAN_NAMES[planType]}
473+
</span>
474+
</div>
475+
</div>
476+
)
477+
}
478+
466479
return (
467480
<>
468481
<div

0 commit comments

Comments
 (0)