suna/frontend/src/components/billing/account-billing-status.tsx

135 lines
5.8 KiB
TypeScript
Raw Normal View History

2025-04-12 02:57:17 +08:00
import { createClient } from "@/lib/supabase/server";
2025-04-27 01:51:25 +08:00
import { SubmitButton } from "@/components/ui/submit-button";
import { manageSubscription, getAccountSubscription } from "@/lib/actions/billing";
import { PlanComparison, SUBSCRIPTION_PLANS } from "@/components/billing/plan-comparison";
2025-04-24 12:30:08 +08:00
import { isLocalMode } from "@/lib/config";
2025-04-12 02:57:17 +08:00
type Props = {
accountId: string;
returnUrl: string;
}
export default async function AccountBillingStatus({ accountId, returnUrl }: Props) {
2025-04-27 01:51:25 +08:00
2025-04-24 12:30:08 +08:00
// In local development mode, show a simplified component
if (isLocalMode()) {
return (
<div className="rounded-xl border shadow-sm bg-card p-6">
<h2 className="text-xl font-semibold mb-4">Billing Status</h2>
<div className="p-4 mb-4 bg-muted/30 border border-border rounded-lg text-center">
<p className="text-sm text-muted-foreground">
Running in local development mode - billing features are disabled
</p>
<p className="text-xs text-muted-foreground mt-2">
Agent usage limits are not enforced in this environment
</p>
</div>
</div>
);
}
2025-04-12 02:57:17 +08:00
2025-04-27 01:51:25 +08:00
const result = await getAccountSubscription(accountId);
2025-04-24 12:30:08 +08:00
2025-04-27 01:51:25 +08:00
// Check if we got an error response or if result is undefined
if (!result || 'message' in result) {
2025-04-26 23:55:57 +08:00
return (
<div className="rounded-xl border shadow-sm bg-card p-6">
<h2 className="text-xl font-semibold mb-4">Billing Status</h2>
<div className="p-4 mb-4 bg-destructive/10 border border-destructive/20 rounded-lg text-center">
<p className="text-sm text-destructive">
2025-04-27 01:51:25 +08:00
Error loading billing status: {result?.message || 'Unknown error'}
2025-04-26 23:55:57 +08:00
</p>
</div>
</div>
);
}
2025-04-27 01:51:25 +08:00
const { subscription: subscriptionData, usage } = result;
2025-04-24 12:30:08 +08:00
const isPlan = (planId?: string) => {
2025-04-27 01:51:25 +08:00
return subscriptionData?.price_id === planId;
2025-04-24 12:30:08 +08:00
};
const planName = isPlan(SUBSCRIPTION_PLANS.FREE)
? "Free"
: isPlan(SUBSCRIPTION_PLANS.PRO)
? "Pro"
: isPlan(SUBSCRIPTION_PLANS.ENTERPRISE)
? "Enterprise"
: "Unknown";
2025-04-14 08:32:08 +08:00
2025-04-12 02:57:17 +08:00
return (
2025-04-24 12:30:08 +08:00
<div className="rounded-xl border shadow-sm bg-card p-6">
<h2 className="text-xl font-semibold mb-4">Billing Status</h2>
2025-04-27 01:51:25 +08:00
{subscriptionData ? (
2025-04-24 12:30:08 +08:00
<>
<div className="mb-6">
2025-04-27 01:56:52 +08:00
<div className="rounded-lg border bg-background p-4 grid grid-cols-1 md:grid-cols-2 gap-4">
2025-04-24 12:30:08 +08:00
<div className="flex justify-between items-center">
<span className="text-sm font-medium text-foreground/90">Agent Usage This Month</span>
2025-04-27 01:51:25 +08:00
<span className="text-sm font-medium text-card-title">{usage.display}</span>
2025-04-24 12:30:08 +08:00
</div>
</div>
</div>
{/* Plans Comparison */}
<PlanComparison
accountId={accountId}
returnUrl={returnUrl}
className="mb-6"
/>
{/* Manage Subscription Button */}
<form>
<input type="hidden" name="accountId" value={accountId} />
<input type="hidden" name="returnUrl" value={returnUrl} />
<SubmitButton
pendingText="Loading..."
formAction={manageSubscription}
className="w-full bg-primary text-white hover:bg-primary/90 shadow-md hover:shadow-lg transition-all"
>
Manage Subscription
</SubmitButton>
</form>
</>
2025-04-16 13:41:55 +08:00
) : (
<>
2025-04-24 12:30:08 +08:00
<div className="mb-6">
<div className="rounded-lg border bg-background p-4 gap-4">
2025-04-16 13:41:55 +08:00
<div className="flex justify-between items-center">
2025-04-24 12:30:08 +08:00
<span className="text-sm font-medium text-foreground/90">Current Plan</span>
<span className="text-sm font-medium text-card-title">Free</span>
2025-04-16 13:41:55 +08:00
</div>
2025-04-24 12:30:08 +08:00
2025-04-16 13:41:55 +08:00
<div className="flex justify-between items-center">
<span className="text-sm font-medium text-foreground/90">Agent Usage This Month</span>
2025-04-27 01:51:25 +08:00
<span className="text-sm font-medium text-card-title">{usage.display}</span>
2025-04-14 08:32:08 +08:00
</div>
2025-04-12 02:57:17 +08:00
</div>
2025-04-16 13:41:55 +08:00
</div>
2025-04-14 08:32:08 +08:00
2025-04-16 13:41:55 +08:00
{/* Plans Comparison */}
<PlanComparison
accountId={accountId}
returnUrl={returnUrl}
className="mb-6"
/>
2025-04-14 08:32:08 +08:00
2025-04-16 13:41:55 +08:00
{/* Manage Subscription Button */}
<form>
<input type="hidden" name="accountId" value={accountId} />
<input type="hidden" name="returnUrl" value={returnUrl} />
<SubmitButton
pendingText="Loading..."
formAction={manageSubscription}
className="w-full bg-primary text-white hover:bg-primary/90 shadow-md hover:shadow-lg transition-all"
>
Manage Subscription
</SubmitButton>
</form>
</>
)}
</div>
2025-04-12 02:57:17 +08:00
)
2025-04-27 01:51:25 +08:00
}