import { ExclamationTriangleIcon } from '@radix-ui/react-icons'; import { z } from 'zod'; import { PlanSchema, ProductSchema } from '@kit/billing'; import { resolveProductPlan } from '@kit/billing-gateway'; import { BillingPortalCard, CurrentLifetimeOrderCard, CurrentSubscriptionCard, } from '@kit/billing-gateway/components'; import { Alert, AlertDescription, AlertTitle } from '@kit/ui/alert'; import { AppBreadcrumbs } from '@kit/ui/app-breadcrumbs'; import { If } from '@kit/ui/if'; import { PageBody } from '@kit/ui/page'; import { Trans } from '@kit/ui/trans'; import { cn } from '@kit/ui/utils'; import billingConfig from '~/config/billing.config'; import { createI18nServerInstance } from '~/lib/i18n/i18n.server'; import { withI18n } from '~/lib/i18n/with-i18n'; // local imports import { TeamAccountLayoutPageHeader } from '../_components/team-account-layout-page-header'; import { loadTeamAccountBillingPage } from '../_lib/server/team-account-billing-page.loader'; import { loadTeamWorkspace } from '../_lib/server/team-account-workspace.loader'; import { TeamAccountCheckoutForm } from './_components/team-account-checkout-form'; import { createBillingPortalSession } from './_lib/server/server-actions'; interface TeamAccountBillingPageProps { params: Promise<{ account: string }>; } export const generateMetadata = async () => { const i18n = await createI18nServerInstance(); const title = i18n.t('teams:billing.pageTitle'); return { title, }; }; async function TeamAccountBillingPage({ params }: TeamAccountBillingPageProps) { const account = (await params).account; const workspace = await loadTeamWorkspace(account); const accountId = workspace.account.id; const [subscription, order, customerId] = await loadTeamAccountBillingPage(accountId); const subscriptionProductPlan = subscription ? await getProductPlan( subscription.items[0]?.variant_id, subscription.currency, ) : undefined; const orderProductPlan = order ? await getProductPlan(order.items[0]?.variant_id, order.currency) : undefined; const hasBillingData = subscription || order; const canManageBilling = workspace.account.permissions.includes('billing.manage'); const Checkout = () => { if (!canManageBilling) { return ; } return ( ); }; const BillingPortal = () => { if (!canManageBilling || !customerId) { return null; } return (
); }; return ( <> } description={} />
{(subscription) => { return ( ); }} {(order) => { return ( ); }}
); } export default withI18n(TeamAccountBillingPage); function CannotManageBillingAlert() { return ( ); } async function getProductPlan( variantId: string | undefined, currency: string, ): Promise< | { product: ProductSchema; plan: z.infer; } | undefined > { if (!variantId) { return undefined; } return resolveProductPlan(billingConfig, variantId, currency); }