import { useMemo, useState } from 'react'; import { msg } from '@lingui/core/macro'; import { useLingui } from '@lingui/react'; import { Trans } from '@lingui/react/macro'; import { AnimatePresence, motion } from 'framer-motion'; import type { InternalClaimPlans } from '@documenso/ee/server-only/stripe/get-internal-claim-plans'; import { useIsMounted } from '@documenso/lib/client-only/hooks/use-is-mounted'; import { useCurrentOrganisation } from '@documenso/lib/client-only/providers/organisation'; import { trpc } from '@documenso/trpc/react'; import { Button } from '@documenso/ui/primitives/button'; import { Card, CardContent, CardTitle } from '@documenso/ui/primitives/card'; import { Tabs, TabsList, TabsTrigger } from '@documenso/ui/primitives/tabs'; import { useToast } from '@documenso/ui/primitives/use-toast'; const MotionCard = motion(Card); export type BillingPlansProps = { plans: InternalClaimPlans; }; export const BillingPlans = ({ plans }: BillingPlansProps) => { const { _ } = useLingui(); const { toast } = useToast(); const isMounted = useIsMounted(); const organisation = useCurrentOrganisation(); const [interval, setInterval] = useState<'monthlyPrice' | 'yearlyPrice'>('yearlyPrice'); const [checkoutSessionPriceId, setCheckoutSessionPriceId] = useState(null); const { mutateAsync: createSubscription } = trpc.billing.subscription.create.useMutation(); const onSubscribeClick = async (priceId: string) => { try { setCheckoutSessionPriceId(priceId); const { redirectUrl } = await createSubscription({ organisationId: organisation.id, priceId, }); window.open(redirectUrl, '_blank'); } catch (_err) { toast({ title: _(msg`Something went wrong`), description: _(msg`An error occurred while trying to create a checkout session.`), variant: 'destructive', }); } finally { setCheckoutSessionPriceId(null); } }; const pricesToDisplay = useMemo(() => { const prices = []; for (const plan of Object.values(plans)) { if (plan[interval] && plan[interval].isVisibleInApp) { prices.push(plan[interval]); } } return prices; }, [plans, interval]); return (
setInterval(value as 'monthlyPrice' | 'yearlyPrice')} > Monthly Yearly
{pricesToDisplay.map((price) => ( {price.product.name}
{price.friendlyPrice + ' '} {interval === 'monthlyPrice' ? ( per month ) : ( per year )}
{price.product.description}
{price.product.features && price.product.features.length > 0 && (
Includes:
    {price.product.features.map((feature, index) => (
  • {feature.name}
  • ))}
)}
))}
); };