import { redirect } from 'next/navigation'; import { match } from 'ts-pattern'; import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-session'; import { Stripe, stripe } from '@documenso/lib/server-only/stripe'; import { getSubscriptionByUserId } from '@documenso/lib/server-only/subscription/get-subscription-by-user-id'; import { LocaleDate } from '~/components/formatter/locale-date'; import BillingPortalButton from './billing-portal-button'; export default async function BillingSettingsPage() { const { user } = await getRequiredServerComponentSession(); const isBillingEnabled = await getServerComponentFlag('app_billing'); // Redirect if subscriptions are not enabled. if (!isBillingEnabled) { redirect('/settings/profile'); } const subscription = await getSubscriptionByUserId({ userId: user.id }); let subscriptionProduct: Stripe.Product | null = null; if (subscription?.planId) { const foundSubscriptionProduct = (await stripe.products.list()).data.find( (item) => item.default_price === subscription.planId, ); subscriptionProduct = foundSubscriptionProduct ?? null; } const isMissingOrInactiveOrFreePlan = !subscription || subscription.status === 'INACTIVE' || subscription?.planId === process.env.NEXT_PUBLIC_STRIPE_FREE_PLAN_ID; return (

Billing

{isMissingOrInactiveOrFreePlan && (

You are currently on the Free Plan.

)} {!isMissingOrInactiveOrFreePlan && match(subscription.status) .with('ACTIVE', () => (

{subscriptionProduct ? ( You are currently subscribed to{' '} {subscriptionProduct.name} ) : ( You currently have an active plan )} {subscription.periodEnd && ( {' '} which is set to{' '} {subscription.cancelAtPeriodEnd ? ( end on{' '} . ) : ( automatically renew on{' '} . )} )}

)) .with('PAST_DUE', () => (

Your current plan is past due. Please update your payment information.

)) .otherwise(() => null)}

); }