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 (
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{' '}
Your current plan is past due. Please update your payment information.
)) .otherwise(() => null)}