import { useMemo, useState } from 'react'; import { msg } from '@lingui/core/macro'; import { useLingui } from '@lingui/react'; import { Trans } from '@lingui/react/macro'; import type * as DialogPrimitive from '@radix-ui/react-dialog'; import { AnimatePresence, motion } from 'framer-motion'; import { Loader, TagIcon } from 'lucide-react'; import { trpc } from '@documenso/trpc/react'; import { Button } from '@documenso/ui/primitives/button'; import { Card, CardContent } from '@documenso/ui/primitives/card'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@documenso/ui/primitives/dialog'; import { Tabs, TabsList, TabsTrigger } from '@documenso/ui/primitives/tabs'; import { useToast } from '@documenso/ui/primitives/use-toast'; export type TeamCheckoutCreateDialogProps = { pendingTeamId: number | null; onClose: () => void; } & Omit; const MotionCard = motion(Card); export const TeamCheckoutCreateDialog = ({ pendingTeamId, onClose, ...props }: TeamCheckoutCreateDialogProps) => { const { _ } = useLingui(); const { toast } = useToast(); const [interval, setInterval] = useState<'monthly' | 'yearly'>('monthly'); const { data, isLoading } = trpc.team.getTeamPrices.useQuery(); const { mutateAsync: createCheckout, isPending: isCreatingCheckout } = trpc.team.createTeamPendingCheckout.useMutation({ onSuccess: (checkoutUrl) => { window.open(checkoutUrl, '_blank'); onClose(); }, onError: () => toast({ title: _(msg`Something went wrong`), description: _( msg`We were unable to create a checkout session. Please try again, or contact support`, ), variant: 'destructive', }), }); const selectedPrice = useMemo(() => { if (!data) { return null; } return data[interval]; }, [data, interval]); const handleOnOpenChange = (open: boolean) => { if (pendingTeamId === null) { return; } if (!open) { onClose(); } }; if (pendingTeamId === null) { return null; } return ( Team checkout Payment is required to finalise the creation of your team. {(isLoading || !data) && (
{isLoading ? ( ) : (

Something went wrong

)}
)} {data && selectedPrice && !isLoading && (
setInterval(value as 'monthly' | 'yearly')} value={interval} className="mb-4" > {[data.monthly, data.yearly].map((price) => ( {price.friendlyInterval} ))} {selectedPrice.interval === 'monthly' ? (
$50 USD per month
) : (
$480 USD per year
20% off
)}

This price includes minimum 5 seats.

Adding and removing seats will adjust your invoice accordingly.

)}
); };