diff --git a/packages/web/src/actions.ts b/packages/web/src/actions.ts index 4f39ecd9..8c288aef 100644 --- a/packages/web/src/actions.ts +++ b/packages/web/src/actions.ts @@ -641,3 +641,20 @@ export const removeMember = async (memberId: string, domain: string): Promise<{ } }) ); + +export const getSubscriptionData = async (domain: string) => + withAuth(async (session) => + withOrgMembership(session, domain, async (orgId) => { + const subscription = await fetchSubscription(orgId); + if (isServiceError(subscription)) { + return orgInvalidSubscription(); + } + + return { + plan: "Team", + seats: subscription.items.data[0].quantity!, + perSeatPrice: subscription.items.data[0].price.unit_amount! / 100, + nextBillingDate: subscription.current_period_end!, + } + }) + ); diff --git a/packages/web/src/app/[domain]/settings/billing/manageSubscriptionButton.tsx b/packages/web/src/app/[domain]/settings/billing/manageSubscriptionButton.tsx index dec774de..dbb16bf6 100644 --- a/packages/web/src/app/[domain]/settings/billing/manageSubscriptionButton.tsx +++ b/packages/web/src/app/[domain]/settings/billing/manageSubscriptionButton.tsx @@ -29,7 +29,7 @@ export function ManageSubscriptionButton() { } return ( - ) diff --git a/packages/web/src/app/[domain]/settings/billing/page.tsx b/packages/web/src/app/[domain]/settings/billing/page.tsx index 6b64b5ac..07534280 100644 --- a/packages/web/src/app/[domain]/settings/billing/page.tsx +++ b/packages/web/src/app/[domain]/settings/billing/page.tsx @@ -1,12 +1,79 @@ -'use server' +import type { Metadata } from "next" +import { CalendarIcon, CreditCard, DollarSign, Users } from "lucide-react" +import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card" +import { Separator } from "@/components/ui/separator" import { ManageSubscriptionButton } from "./manageSubscriptionButton" +import { getSubscriptionData } from "@/actions" +import { isServiceError } from "@/lib/utils" +export const metadata: Metadata = { + title: "Billing | Settings", + description: "Manage your subscription and billing information", +} -export default async function BillingPage() { - return ( -
-

Billing

+interface BillingPageProps { + params: { + domain: string + } +} + +export default async function BillingPage({ + params: { domain }, +}: BillingPageProps) { + const subscription = await getSubscriptionData(domain) + + if (isServiceError(subscription)) { + return
Failed to fetch subscription data. Please contact us at team@sourcebot.dev if this issue persists.
+ } + + return ( +
+
+

Billing

+

Manage your subscription and billing information

+
+ +
+ + + Subscription Plan + You are currently on the {subscription.plan} plan. + + +
+
+ +
+

Seats

+

{subscription.seats} active users

+
+
+
+
+
+ +
+

Next Billing Date

+

{new Date(subscription.nextBillingDate * 1000).toLocaleDateString()}

+
+
+
+
+
+ +
+

Billing Amount

+

${(subscription.perSeatPrice * subscription.seats).toFixed(2)} per month

+
+
+
+
+ -
- ); -} \ No newline at end of file + + +
+
+ ) +} +