From 8adc44802f9768b76787ed9138a73deedd6a1314 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan <55143799+dephraiim@users.noreply.github.com> Date: Fri, 17 Nov 2023 05:12:47 +0000 Subject: [PATCH] feat: copy signing link from avatar stack (#658) --- .../app/(dashboard)/documents/data-table.tsx | 4 +- .../avatar/avatar-with-recipient.tsx | 46 +++++++++++++++++++ .../avatar/stack-avatars-with-tooltip.tsx | 23 ++-------- .../server-only/document/find-documents.ts | 17 ++----- 4 files changed, 57 insertions(+), 33 deletions(-) create mode 100644 apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx diff --git a/apps/web/src/app/(dashboard)/documents/data-table.tsx b/apps/web/src/app/(dashboard)/documents/data-table.tsx index 475bfa434..9d07b8278 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table.tsx @@ -6,8 +6,8 @@ import { Loader } from 'lucide-react'; import { useSession } from 'next-auth/react'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; -import { FindResultSet } from '@documenso/lib/types/find-result-set'; -import { Document, Recipient, User } from '@documenso/prisma/client'; +import type { FindResultSet } from '@documenso/lib/types/find-result-set'; +import type { Document, Recipient, User } from '@documenso/prisma/client'; import { DataTable } from '@documenso/ui/primitives/data-table'; import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; diff --git a/apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx b/apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx new file mode 100644 index 000000000..8429870b0 --- /dev/null +++ b/apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx @@ -0,0 +1,46 @@ +'use client'; + +import React from 'react'; + +import { useCopyToClipboard } from '@documenso/lib/client-only/hooks/use-copy-to-clipboard'; +import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; +import { recipientAbbreviation } from '@documenso/lib/utils/recipient-formatter'; +import type { Recipient } from '@documenso/prisma/client'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +import { StackAvatar } from './stack-avatar'; + +export type AvatarWithRecipientProps = { + recipient: Recipient; +}; + +export function AvatarWithRecipient({ recipient }: AvatarWithRecipientProps) { + const [, copy] = useCopyToClipboard(); + const { toast } = useToast(); + + const onRecipientClick = () => { + void copy(`${process.env.NEXT_PUBLIC_WEBAPP_URL}/sign/${recipient.token}`).then(() => { + toast({ + title: 'Copied to clipboard', + description: 'The signing link has been copied to your clipboard.', + }); + }); + }; + + return ( +
+ + + {recipient.email} + +
+ ); +} diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx index 8d611c2d1..333cc6134 100644 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx @@ -1,6 +1,6 @@ import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; import { recipientAbbreviation } from '@documenso/lib/utils/recipient-formatter'; -import { Recipient } from '@documenso/prisma/client'; +import type { Recipient } from '@documenso/prisma/client'; import { Tooltip, TooltipContent, @@ -8,6 +8,7 @@ import { TooltipTrigger, } from '@documenso/ui/primitives/tooltip'; +import { AvatarWithRecipient } from './avatar-with-recipient'; import { StackAvatar } from './stack-avatar'; import { StackAvatars } from './stack-avatars'; @@ -85,15 +86,7 @@ export const StackAvatarsWithTooltip = ({

Opened

{openedRecipients.map((recipient: Recipient) => ( -
- - {recipient.email} -
+ ))}
)} @@ -102,15 +95,7 @@ export const StackAvatarsWithTooltip = ({

Uncompleted

{uncompletedRecipients.map((recipient: Recipient) => ( -
- - {recipient.email} -
+ ))}
)} diff --git a/packages/lib/server-only/document/find-documents.ts b/packages/lib/server-only/document/find-documents.ts index 2581c5738..20b7eb369 100644 --- a/packages/lib/server-only/document/find-documents.ts +++ b/packages/lib/server-only/document/find-documents.ts @@ -2,10 +2,11 @@ import { DateTime } from 'luxon'; import { P, match } from 'ts-pattern'; import { prisma } from '@documenso/prisma'; -import { Document, Prisma, SigningStatus } from '@documenso/prisma/client'; +import type { Document, Prisma } from '@documenso/prisma/client'; +import { SigningStatus } from '@documenso/prisma/client'; import { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-document-status'; -import { FindResultSet } from '../../types/find-result-set'; +import type { FindResultSet } from '../../types/find-result-set'; export interface FindDocumentsOptions { userId: number; @@ -160,19 +161,11 @@ export const findDocuments = async ({ }), ]); - const maskedData = data.map((doc) => ({ - ...doc, - Recipient: doc.Recipient.map((recipient) => ({ - ...recipient, - token: recipient.email === user.email ? recipient.token : '', - })), - })); - return { - data: maskedData, + data, count, currentPage: Math.max(page, 1), perPage, totalPages: Math.ceil(count / perPage), - } satisfies FindResultSet; + } satisfies FindResultSet; };