import { useMemo, useState } from 'react'; import { msg } from '@lingui/core/macro'; import { useLingui } from '@lingui/react'; import { Trans } from '@lingui/react/macro'; import type { TemplateDirectLink } from '@prisma/client'; import { TemplateType } from '@prisma/client'; import { EditIcon, FileIcon, LinkIcon, MoreHorizontalIcon, Trash2Icon } from 'lucide-react'; import { useCopyToClipboard } from '@documenso/lib/client-only/hooks/use-copy-to-clipboard'; import { formatDirectTemplatePath } from '@documenso/lib/utils/templates'; import { trpc } from '@documenso/trpc/react'; import type { FindTemplateRow } from '@documenso/trpc/server/template-router/schema'; 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/dialogs/public-profile-template-manage-dialog'; type DirectTemplate = FindTemplateRow & { directLink: Pick; }; export const SettingsPublicProfileTemplatesTable = () => { const { _ } = useLingui(); const { toast } = useToast(); const [, copy] = useCopyToClipboard(); const [publicTemplateDialogPayload, setPublicTemplateDialogPayload] = useState<{ step: 'MANAGE' | 'CONFIRM_DISABLE'; templateId: number; } | null>(null); const { data, isLoading, isLoadingError, refetch } = trpc.template.findTemplates.useQuery( {}, { placeholderData: (previousData) => previousData, }, ); const { directTemplates, publicDirectTemplates, privateDirectTemplates } = useMemo(() => { const directTemplates = (data?.data ?? []).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: _(msg`Copied to clipboard`), description: _(msg`The direct link has been copied to your clipboard`), }); }); return (
{/* Loading and error handling states. */} {publicDirectTemplates.length === 0 && ( <> {isLoading && Array(3) .fill(0) .map((_, index) => (
))} {isLoadingError && (
Unable to load your public profile templates at this time
)} {!isLoading && (
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); } }} />
); };