'use client'; import { useMemo, useState } from 'react'; import { EditIcon, FileIcon, LinkIcon, MoreHorizontalIcon, Trash2Icon } from 'lucide-react'; import { useCopyToClipboard } from '@documenso/lib/client-only/hooks/use-copy-to-clipboard'; import type { FindTemplateRow } from '@documenso/lib/server-only/template/find-templates'; import { formatDirectTemplatePath } from '@documenso/lib/utils/templates'; import type { TemplateDirectLink } from '@documenso/prisma/client'; import { TemplateType } from '@documenso/prisma/client'; import { trpc } from '@documenso/trpc/react'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuTrigger, } from '@documenso/ui/primitives/dropdown-menu'; import { Skeleton } from '@documenso/ui/primitives/skeleton'; import { useToast } from '@documenso/ui/primitives/use-toast'; import { ManagePublicTemplateDialog } from '~/components/templates/manage-public-template-dialog'; import { useOptionalCurrentTeam } from '~/providers/team'; type DirectTemplate = FindTemplateRow & { directLink: Pick; }; export const PublicTemplatesDataTable = () => { const team = useOptionalCurrentTeam(); const { toast } = useToast(); const [, copy] = useCopyToClipboard(); const [publicTemplateDialogPayload, setPublicTemplateDialogPayload] = useState<{ step: 'MANAGE' | 'CONFIRM_DISABLE'; templateId: number; } | null>(null); const { data, isInitialLoading, isLoadingError, refetch } = trpc.template.findTemplates.useQuery( { teamId: team?.id, }, { keepPreviousData: true, }, ); const { directTemplates, publicDirectTemplates, privateDirectTemplates } = useMemo(() => { const directTemplates = (data?.templates ?? []).filter( (template): template is DirectTemplate => template.directLink?.enabled === true, ); const publicDirectTemplates = directTemplates.filter( (template) => template.directLink?.enabled === true && template.type === TemplateType.PUBLIC, ); const privateDirectTemplates = directTemplates.filter( (template) => template.directLink?.enabled === true && template.type === TemplateType.PRIVATE, ); return { directTemplates, publicDirectTemplates, privateDirectTemplates, }; }, [data]); const onCopyClick = async (token: string) => copy(formatDirectTemplatePath(token)).then(() => { toast({ title: 'Copied to clipboard', description: 'The direct link has been copied to your clipboard', }); }); return (
{/* Loading and error handling states. */} {publicDirectTemplates.length === 0 && ( <> {isInitialLoading && Array(3) .fill(0) .map((_, index) => (
))} {isLoadingError && (
Unable to load your public profile templates at this time
)} {!isInitialLoading && (
No public profile templates found Click here to get started } />
)} )} {/* Public templates list. */} {publicDirectTemplates.map((template) => (

{template.publicTitle}

{template.publicDescription}

Action void onCopyClick(template.directLink.token)}> Copy sharable link { setPublicTemplateDialogPayload({ step: 'MANAGE', templateId: template.id, }); }} > Update setPublicTemplateDialogPayload({ step: 'CONFIRM_DISABLE', templateId: template.id, }) } > Remove
))}
{ if (!value) { setPublicTemplateDialogPayload(null); } }} />
); };