'use client'; import { useState } from 'react'; import Link from 'next/link'; import { useRouter } from 'next/navigation'; import { Loader } from 'lucide-react'; import { useSession } from 'next-auth/react'; import { useLimits } from '@documenso/ee/server-only/limits/provider/client'; import { useAnalytics } from '@documenso/lib/client-only/hooks/use-analytics'; import { createDocumentData } from '@documenso/lib/server-only/document-data/create-document-data'; import { putFile } from '@documenso/lib/universal/upload/put-file'; import { TRPCClientError } from '@documenso/trpc/client'; import { trpc } from '@documenso/trpc/react'; import { cn } from '@documenso/ui/lib/utils'; import { DocumentDropzone } from '@documenso/ui/primitives/document-dropzone'; import { useToast } from '@documenso/ui/primitives/use-toast'; export type UploadDocumentProps = { className?: string; }; export const UploadDocument = ({ className }: UploadDocumentProps) => { const router = useRouter(); const analytics = useAnalytics(); const { data: session } = useSession(); const { toast } = useToast(); const { quota, remaining } = useLimits(); const [isLoading, setIsLoading] = useState(false); const { mutateAsync: createDocument } = trpc.document.createDocument.useMutation(); const onFileDrop = async (file: File) => { try { setIsLoading(true); const { type, data } = await putFile(file); const { id: documentDataId } = await createDocumentData({ type, data, }); const { id } = await createDocument({ title: file.name, documentDataId, }); toast({ title: 'Document uploaded', description: 'Your document has been uploaded successfully.', duration: 5000, }); analytics.capture('App: Document Uploaded', { userId: session?.user.id, documentId: id, timestamp: new Date().toISOString(), }); router.push(`/documents/${id}`); } catch (error) { console.error(error); if (error instanceof TRPCClientError) { toast({ title: 'Error', description: error.message, variant: 'destructive', }); } else { toast({ title: 'Error', description: 'An error occurred while uploading your document.', variant: 'destructive', }); } } finally { setIsLoading(false); } }; return (
{remaining.documents > 0 && Number.isFinite(remaining.documents) && (

{remaining.documents} of {quota.documents} documents remaining this month.

)}
{isLoading && (
)} {remaining.documents === 0 && (

You have reached your document limit.

You can upload up to {quota.documents} documents per month on your current plan.

Upgrade your account to upload more documents.
)}
); };