'use client'; import { HTMLAttributes, useState } from 'react'; import { Copy, Share } from 'lucide-react'; import { FaXTwitter } from 'react-icons/fa6'; import { useCopyToClipboard } from '@documenso/lib/client-only/hooks/use-copy-to-clipboard'; import { generateTwitterIntent } from '@documenso/lib/universal/generate-twitter-intent'; import { trpc } from '@documenso/trpc/react'; 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 { useToast } from '@documenso/ui/primitives/use-toast'; export type DocumentShareButtonProps = HTMLAttributes & { token: string; documentId: number; }; export const DocumentShareButton = ({ token, documentId, className }: DocumentShareButtonProps) => { const { toast } = useToast(); const [, copyToClipboard] = useCopyToClipboard(); const [isOpen, setIsOpen] = useState(false); const { mutateAsync: createOrGetShareLink, data: shareLink, isLoading, } = trpc.shareLink.createOrGetShareLink.useMutation(); const onOpenChange = (nextOpen: boolean) => { if (nextOpen) { void createOrGetShareLink({ token, documentId, }); } setIsOpen(nextOpen); }; const onCopyClick = async () => { let { slug = '' } = shareLink || {}; if (!slug) { const result = await createOrGetShareLink({ token, documentId, }); slug = result.slug; } await copyToClipboard(`${process.env.NEXT_PUBLIC_WEBAPP_URL}/share/${slug}`).catch(() => null); toast({ title: 'Copied to clipboard', description: 'The sharing link has been copied to your clipboard.', }); setIsOpen(false); }; const onTweetClick = async () => { let { slug = '' } = shareLink || {}; if (!slug) { const result = await createOrGetShareLink({ token, documentId, }); slug = result.slug; } window.open( generateTwitterIntent( `I just ${token ? 'signed' : 'sent'} a document with @documenso. Check it out!`, `${process.env.NEXT_PUBLIC_WEBAPP_URL}/share/${slug}`, ), '_blank', ); setIsOpen(false); }; return ( {!isLoading && } Share Share Share your signing experience! I just {token ? 'signed' : 'sent'} a document with{' '} @documenso . Check it out! {process.env.NEXT_PUBLIC_WEBAPP_URL}/share/{shareLink?.slug || '...'} Tweet Or Copy Link ); };