'use client'; import { useEffect, useMemo, useState } from 'react'; import { Trans, msg } from '@lingui/macro'; import { useLingui } from '@lingui/react'; import type { Team, TeamProfile, TemplateDirectLink, User, UserProfile, } from '@documenso/prisma/client'; import { TemplateType } from '@documenso/prisma/client'; import { trpc } from '@documenso/trpc/react'; import type { FindTemplateRow } from '@documenso/trpc/server/template-router/schema'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; import { Switch } from '@documenso/ui/primitives/switch'; import { Tooltip, TooltipContent, TooltipTrigger } from '@documenso/ui/primitives/tooltip'; import { useToast } from '@documenso/ui/primitives/use-toast'; import { SettingsHeader } from '~/components/(dashboard)/settings/layout/header'; import type { TPublicProfileFormSchema } from '~/components/forms/public-profile-form'; import { PublicProfileForm } from '~/components/forms/public-profile-form'; import { ManagePublicTemplateDialog } from '~/components/templates/manage-public-template-dialog'; import { PublicTemplatesDataTable } from './public-templates-data-table'; export type PublicProfilePageViewOptions = { user: User; team?: Team; profile: UserProfile | TeamProfile; }; type DirectTemplate = FindTemplateRow & { directLink: Pick; }; const userProfileText = { settingsTitle: msg`Public Profile`, settingsSubtitle: msg`You can choose to enable or disable your profile for public view.`, templatesTitle: msg`My templates`, templatesSubtitle: msg`Show templates in your public profile for your audience to sign and get started quickly`, }; const teamProfileText = { settingsTitle: msg`Team Public Profile`, settingsSubtitle: msg`You can choose to enable or disable your team profile for public view.`, templatesTitle: msg`Team templates`, templatesSubtitle: msg`Show templates in your team public profile for your audience to sign and get started quickly`, }; export const PublicProfilePageView = ({ user, team, profile }: PublicProfilePageViewOptions) => { const { _ } = useLingui(); const { toast } = useToast(); const [isPublicProfileVisible, setIsPublicProfileVisible] = useState(profile.enabled); const [isTooltipOpen, setIsTooltipOpen] = useState(false); const { data } = trpc.template.findTemplates.useQuery({ perPage: 100, }); const { mutateAsync: updateUserProfile, isPending: isUpdatingUserProfile } = trpc.profile.updatePublicProfile.useMutation(); const { mutateAsync: updateTeamProfile, isPending: isUpdatingTeamProfile } = trpc.team.updateTeamPublicProfile.useMutation(); const isUpdating = isUpdatingUserProfile || isUpdatingTeamProfile; const profileText = team ? teamProfileText : userProfileText; const enabledPrivateDirectTemplates = useMemo( () => (data?.data ?? []).filter( (template): template is DirectTemplate => template.directLink?.enabled === true && template.type !== TemplateType.PUBLIC, ), [data], ); const onProfileUpdate = async (data: TPublicProfileFormSchema) => { if (team) { await updateTeamProfile({ teamId: team.id, ...data, }); } else { await updateUserProfile(data); } if (data.enabled === undefined && !isPublicProfileVisible) { setIsTooltipOpen(true); } }; const togglePublicProfileVisibility = async (isVisible: boolean) => { setIsTooltipOpen(false); if (isUpdating) { return; } if (isVisible && !user.url) { toast({ title: _(msg`You must set a profile URL before enabling your public profile.`), variant: 'destructive', }); return; } setIsPublicProfileVisible(isVisible); try { await onProfileUpdate({ enabled: isVisible, }); } catch { toast({ title: _(msg`Something went wrong`), description: _(msg`We were unable to set your public profile to public. Please try again.`), variant: 'destructive', }); setIsPublicProfileVisible(!isVisible); } }; useEffect(() => { setIsPublicProfileVisible(profile.enabled); }, [profile.enabled]); return (
*:first-child]:text-muted-foreground': !isPublicProfileVisible, '[&>*:last-child]:text-muted-foreground': isPublicProfileVisible, }, )} > Hide Show
{isPublicProfileVisible ? ( <>

Profile is currently visible.

Toggle the switch to hide your profile from the public.

) : ( <>

Profile is currently hidden.

Toggle the switch to show your profile to the public.

)}
Link template } />
); };