mirror of
https://github.com/documenso/documenso.git
synced 2025-11-12 07:43:16 +10:00
78 lines
2.5 KiB
TypeScript
78 lines
2.5 KiB
TypeScript
import Link from 'next/link';
|
|
import { redirect } from 'next/navigation';
|
|
|
|
import { createCustomer } from '@documenso/ee/server-only/stripe/create-customer';
|
|
import { getPortalSession } from '@documenso/ee/server-only/stripe/get-portal-session';
|
|
import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-session';
|
|
import { getServerComponentFlag } from '@documenso/lib/server-only/feature-flags/get-server-component-feature-flag';
|
|
import { getSubscriptionByUserId } from '@documenso/lib/server-only/subscription/get-subscription-by-user-id';
|
|
import { SubscriptionStatus } from '@documenso/prisma/client';
|
|
import { Button } from '@documenso/ui/primitives/button';
|
|
|
|
import { LocaleDate } from '~/components/formatter/locale-date';
|
|
|
|
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 }).then(async (sub) => {
|
|
if (sub) {
|
|
return sub;
|
|
}
|
|
|
|
// If we don't have a customer record, create one as well as an empty subscription.
|
|
return createCustomer({ user });
|
|
});
|
|
|
|
let billingPortalUrl = '';
|
|
|
|
if (subscription.customerId) {
|
|
billingPortalUrl = await getPortalSession({
|
|
customerId: subscription.customerId,
|
|
returnUrl: `${process.env.NEXT_PUBLIC_WEBAPP_URL}/settings/billing`,
|
|
});
|
|
}
|
|
|
|
return (
|
|
<div>
|
|
<h3 className="text-lg font-medium">Billing</h3>
|
|
|
|
<p className="text-muted-foreground mt-2 text-sm">
|
|
Your subscription is{' '}
|
|
{subscription.status !== SubscriptionStatus.INACTIVE ? 'active' : 'inactive'}.
|
|
{subscription?.periodEnd && (
|
|
<>
|
|
{' '}
|
|
Your next payment is due on{' '}
|
|
<span className="font-semibold">
|
|
<LocaleDate date={subscription.periodEnd} />
|
|
</span>
|
|
.
|
|
</>
|
|
)}
|
|
</p>
|
|
|
|
<hr className="my-4" />
|
|
|
|
{billingPortalUrl && (
|
|
<Button asChild>
|
|
<Link href={billingPortalUrl}>Manage Subscription</Link>
|
|
</Button>
|
|
)}
|
|
|
|
{!billingPortalUrl && (
|
|
<p className="text-muted-foreground max-w-[60ch] text-base">
|
|
You do not currently have a customer record, this should not happen. Please contact
|
|
support for assistance.
|
|
</p>
|
|
)}
|
|
</div>
|
|
);
|
|
}
|