'use client'; import React, { useState } from 'react'; import { useSearchParams } from 'next/navigation'; import { zodResolver } from '@hookform/resolvers/zod'; import { Info } from 'lucide-react'; import { usePlausible } from 'next-plausible'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from '@documenso/ui/primitives/dialog'; import { Input } from '@documenso/ui/primitives/input'; import { Label } from '@documenso/ui/primitives/label'; import { useToast } from '@documenso/ui/primitives/use-toast'; import { claimPlan } from '~/api/claim-plan/fetcher'; import { FormErrorMessage } from '../form/form-error-message'; export const ZClaimPlanDialogFormSchema = z.object({ name: z.string().min(3), email: z.string().email(), }); export type TClaimPlanDialogFormSchema = z.infer; export type ClaimPlanDialogProps = { className?: string; planId: string; children: React.ReactNode; }; export const ClaimPlanDialog = ({ className, planId, children }: ClaimPlanDialogProps) => { const params = useSearchParams(); const { toast } = useToast(); const event = usePlausible(); const [open, setOpen] = useState(() => params?.get('cancelled') === 'true'); const { register, handleSubmit, formState: { errors, isSubmitting }, } = useForm({ mode: 'onBlur', defaultValues: { name: params?.get('name') ?? '', email: params?.get('email') ?? '', }, resolver: zodResolver(ZClaimPlanDialogFormSchema), }); const onFormSubmit = async ({ name, email }: TClaimPlanDialogFormSchema) => { try { const delay = new Promise((resolve) => { setTimeout(resolve, 1000); }); const [redirectUrl] = await Promise.all([ claimPlan({ name, email, planId, signatureText: name, signatureDataUrl: null }), delay, ]); event('claim-plan-pricing'); window.location.href = redirectUrl; } catch (error) { event('claim-plan-failed'); toast({ title: 'Something went wrong', description: error instanceof Error ? error.message : 'Please try again later.', variant: 'destructive', }); } }; return ( !isSubmitting && setOpen(value)}> {children} Claim your plan We're almost there! Please enter your email address and name to claim your plan.
{params?.get('cancelled') === 'true' && (

You have cancelled the payment process. If you didn't mean to do this, please try again.

)}
); };