From 36bc57f0b9700806101a136e67f81e0f43cd31e9 Mon Sep 17 00:00:00 2001 From: Waleed Date: Wed, 25 Mar 2026 23:44:05 -0700 Subject: [PATCH 1/2] fix(ui): polish subscription billing settings (#3781) * fix(ui): polish subscription billing settings Made-with: Cursor * fix(ui): trigger purchase refresh on success Made-with: Cursor --- .../credit-balance/credit-balance.tsx | 70 ++++++++++++++----- .../components/subscription/subscription.tsx | 25 ++++--- 2 files changed, 63 insertions(+), 32 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/subscription/components/credit-balance/credit-balance.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/subscription/components/credit-balance/credit-balance.tsx index aeb05dd4c2..f122b31405 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/subscription/components/credit-balance/credit-balance.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/subscription/components/credit-balance/credit-balance.tsx @@ -1,6 +1,6 @@ 'use client' -import { useState } from 'react' +import { useEffect, useRef, useState } from 'react' import { Button, Input, @@ -39,10 +39,55 @@ export function CreditBalance({ const [validationError, setValidationError] = useState(null) const [requestId, setRequestId] = useState(null) const purchaseCredits = usePurchaseCredits() + const closeTimeoutRef = useRef | null>(null) const dollarAmount = Number.parseInt(amount, 10) || 0 const creditPreview = dollarsToCredits(dollarAmount) + const clearCloseTimeout = () => { + if (closeTimeoutRef.current) { + clearTimeout(closeTimeoutRef.current) + closeTimeoutRef.current = null + } + } + + const resetModalState = () => { + setAmount('') + setValidationError(null) + purchaseCredits.reset() + } + + const openModal = () => { + clearCloseTimeout() + resetModalState() + setRequestId(crypto.randomUUID()) + setIsOpen(true) + } + + const closeModal = () => { + clearCloseTimeout() + setIsOpen(false) + setRequestId(null) + resetModalState() + } + + useEffect(() => { + return () => { + clearCloseTimeout() + } + }, []) + + const handleOpenChange = (open: boolean) => { + if (open) { + openModal() + return + } + + if (!purchaseCredits.isPending) { + closeModal() + } + } + const handleAmountChange = (value: string) => { const numericValue = value.replace(/[^0-9]/g, '') setAmount(numericValue) @@ -68,27 +113,16 @@ export function CreditBalance({ { amount: numAmount, requestId }, { onSuccess: () => { - setTimeout(() => { - setIsOpen(false) - onPurchaseComplete?.() + onPurchaseComplete?.() + clearCloseTimeout() + closeTimeoutRef.current = setTimeout(() => { + closeModal() }, 1500) }, } ) } - const handleOpenChange = (open: boolean) => { - setIsOpen(open) - if (open) { - setRequestId(crypto.randomUUID()) - } else { - setAmount('') - setValidationError(null) - purchaseCredits.reset() - setRequestId(null) - } - } - const displayError = validationError || purchaseCredits.error?.message return ( @@ -103,9 +137,7 @@ export function CreditBalance({ {canPurchase && ( - + Add Credits diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/subscription/subscription.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/subscription/subscription.tsx index ac36b35488..9ca4256613 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/subscription/subscription.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/subscription/subscription.tsx @@ -192,9 +192,9 @@ function CreditPlanCard({ return (
-
+
{name} -
+
${isAnnual ? discountedMonthly : dollars} @@ -207,7 +207,7 @@ function CreditPlanCard({
-
+
{credits.toLocaleString()} @@ -242,13 +242,13 @@ function CreditPlanCard({
)} -
+
{isCurrentPlan ? ( - ) : ( - )} @@ -933,9 +933,9 @@ export function Subscription() { {/* Billing details section */} {(subscription.isPaid || (!isLoading && isTeamAdmin)) && ( -
+
{subscription.isPaid && permissions.canViewUsageInfo && ( -
+
+
{new Date(subscriptionData.data.periodEnd).toLocaleDateString()} @@ -961,7 +961,7 @@ export function Subscription() { )} {subscription.isPaid && permissions.canViewUsageInfo && ( -
+
)} @@ -969,11 +969,10 @@ export function Subscription() { {subscription.isPaid && !permissions.showTeamMemberView && !permissions.isEnterpriseMember && ( -
+