import { useEffect, useState } from 'react'; import { Trans, msg } from '@lingui/macro'; import { useLingui } from '@lingui/react'; import type { Recipient } from '@prisma/client'; import { RecipientRole } from '@prisma/client'; import { useSearchParams } from 'react-router'; import { useCopyToClipboard } from '@documenso/lib/client-only/hooks/use-copy-to-clipboard'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; import { RECIPIENT_ROLES_DESCRIPTION } from '@documenso/lib/constants/recipient-roles'; import { formatSigningLink } from '@documenso/lib/utils/recipients'; import { CopyTextButton } from '@documenso/ui/components/common/copy-text-button'; import { AvatarWithText } from '@documenso/ui/primitives/avatar'; import { Button } from '@documenso/ui/primitives/button'; import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from '@documenso/ui/primitives/dialog'; import { useToast } from '@documenso/ui/primitives/use-toast'; export type DocumentRecipientLinkCopyDialogProps = { trigger?: React.ReactNode; recipients: Recipient[]; }; export const DocumentRecipientLinkCopyDialog = ({ trigger, recipients, }: DocumentRecipientLinkCopyDialogProps) => { const { _ } = useLingui(); const { toast } = useToast(); const [, copy] = useCopyToClipboard(); const [searchParams] = useSearchParams(); const updateSearchParams = useUpdateSearchParams(); const [open, setOpen] = useState(false); const actionSearchParam = searchParams?.get('action'); const onBulkCopy = async () => { const generatedString = recipients .filter((recipient) => recipient.role !== RecipientRole.CC) .map((recipient) => `${recipient.email}\n${NEXT_PUBLIC_WEBAPP_URL()}/sign/${recipient.token}`) .join('\n\n'); await copy(generatedString).then(() => { toast({ title: _(msg`Copied to clipboard`), description: _(msg`All signing links have been copied to your clipboard.`), }); }); }; useEffect(() => { if (actionSearchParam === 'view-signing-links') { setOpen(true); updateSearchParams({ action: null }); } }, [actionSearchParam, open, setOpen, updateSearchParams]); return ( setOpen(value)}> e.stopPropagation()}> {trigger} Copy Signing Links You can copy and share these links to recipients so they can action the document. ); };