'use client'; import type { HTMLAttributes } from 'react'; import React, { useState } from 'react'; import { Copy, Sparkles } from 'lucide-react'; import { FaXTwitter } from 'react-icons/fa6'; import { useCopyShareLink } from '@documenso/lib/client-only/hooks/use-copy-share-link'; import { TOAST_DOCUMENT_SHARE_ERROR, TOAST_DOCUMENT_SHARE_SUCCESS, } from '@documenso/lib/constants/toast'; 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; trigger?: (_props: { loading: boolean; disabled: boolean }) => React.ReactNode; }; export const DocumentShareButton = ({ token, documentId, className, trigger, }: DocumentShareButtonProps) => { const { toast } = useToast(); const { copyShareLink, createAndCopyShareLink, isCopyingShareLink } = useCopyShareLink({ onSuccess: () => toast(TOAST_DOCUMENT_SHARE_SUCCESS), onError: () => toast(TOAST_DOCUMENT_SHARE_ERROR), }); const [isOpen, setIsOpen] = useState(false); const { mutateAsync: createOrGetShareLink, data: shareLink, isLoading: isCreatingOrGettingShareLink, } = trpc.shareLink.createOrGetShareLink.useMutation(); const isLoading = isCreatingOrGettingShareLink || isCopyingShareLink; const onOpenChange = (nextOpen: boolean) => { if (nextOpen) { void createOrGetShareLink({ token, documentId, }); } setIsOpen(nextOpen); }; const onCopyClick = async () => { if (shareLink) { await copyShareLink(`${process.env.NEXT_PUBLIC_WEBAPP_URL}/share/${shareLink.slug}`); } else { await createAndCopyShareLink({ token, documentId, }); } setIsOpen(false); }; const onTweetClick = async () => { let { slug = '' } = shareLink || {}; if (!slug) { const result = await createOrGetShareLink({ token, documentId, }); slug = result.slug; } // Ensuring we've prewarmed the opengraph image for the Twitter await fetch(`${process.env.NEXT_PUBLIC_WEBAPP_URL}/share/${slug}/opengraph`, { // We don't care about the response, so we can use no-cors mode: 'no-cors', }); window.open( generateTwitterIntent( `I just ${token ? 'signed' : 'sent'} a document in style with @documenso. Check it out!`, `${process.env.NEXT_PUBLIC_WEBAPP_URL}/share/${slug}`, ), '_blank', ); setIsOpen(false); }; return ( e.stopPropagation()} asChild> {trigger?.({ disabled: !documentId, loading: isLoading, }) || ( {!isLoading && } Share Signature Card )} Share your signing experience! Don't worry, the document you signed or sent wont be shared; only your signing experience is. Share your signing card and showcase your signature! I just {token ? 'signed' : 'sent'} a document in style with{' '} @documenso . Check it out! {process.env.NEXT_PUBLIC_WEBAPP_URL}/share/{shareLink?.slug || '...'} {shareLink?.slug && ( )} Tweet Copy Link ); };