'use client'; import { useRouter } from 'next/navigation'; import { zodResolver } from '@hookform/resolvers/zod'; import { Trans, msg } from '@lingui/macro'; import { useLingui } from '@lingui/react'; import { AnimatePresence, motion } from 'framer-motion'; import { useSession } from 'next-auth/react'; import { useForm } from 'react-hook-form'; import { match } from 'ts-pattern'; import type { z } from 'zod'; import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import { DocumentVisibility } from '@documenso/prisma/client'; import { trpc } from '@documenso/trpc/react'; import { ZUpdateTeamMutationSchema } from '@documenso/trpc/server/team-router/schema'; import { DocumentVisibilitySelect, DocumentVisibilityTooltip, } from '@documenso/ui/components/document/document-visibility-select'; import { Button } from '@documenso/ui/primitives/button'; import { Checkbox } from '@documenso/ui/primitives/checkbox'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@documenso/ui/primitives/form/form'; import { Input } from '@documenso/ui/primitives/input'; import { useToast } from '@documenso/ui/primitives/use-toast'; export type UpdateTeamDialogProps = { teamId: number; teamName: string; teamUrl: string; documentVisibility?: DocumentVisibility; includeSenderDetails?: boolean; }; const ZUpdateTeamFormSchema = ZUpdateTeamMutationSchema.shape.data.pick({ name: true, url: true, documentVisibility: true, includeSenderDetails: true, }); type TUpdateTeamFormSchema = z.infer; export const UpdateTeamForm = ({ teamId, teamName, teamUrl, documentVisibility, includeSenderDetails, }: UpdateTeamDialogProps) => { const router = useRouter(); const { data: session } = useSession(); const email = session?.user?.email; const { _ } = useLingui(); const { toast } = useToast(); const form = useForm({ resolver: zodResolver(ZUpdateTeamFormSchema), defaultValues: { name: teamName, url: teamUrl, documentVisibility, includeSenderDetails, }, }); const { mutateAsync: updateTeam } = trpc.team.updateTeam.useMutation(); const includeSenderDetailsCheck = form.watch('includeSenderDetails'); const mapVisibilityToRole = (visibility: DocumentVisibility): DocumentVisibility => match(visibility) .with(DocumentVisibility.ADMIN, () => DocumentVisibility.ADMIN) .with(DocumentVisibility.MANAGER_AND_ABOVE, () => DocumentVisibility.MANAGER_AND_ABOVE) .otherwise(() => DocumentVisibility.EVERYONE); const currentVisibilityRole = mapVisibilityToRole( documentVisibility ?? DocumentVisibility.EVERYONE, ); const onFormSubmit = async ({ name, url, documentVisibility, includeSenderDetails, }: TUpdateTeamFormSchema) => { try { await updateTeam({ data: { name, url, documentVisibility, includeSenderDetails, }, teamId, }); toast({ title: _(msg`Success`), description: _(msg`Your team has been successfully updated.`), duration: 5000, }); form.reset({ name, url, documentVisibility, includeSenderDetails, }); if (url !== teamUrl) { router.push(`${WEBAPP_BASE_URL}/t/${url}/settings`); } } catch (err) { const error = AppError.parseError(err); if (error.code === AppErrorCode.ALREADY_EXISTS) { form.setError('url', { type: 'manual', message: _(msg`This URL is already in use.`), }); return; } toast({ title: _(msg`An unknown error occurred`), description: _( msg`We encountered an unknown error while attempting to update your team. Please try again later.`, ), variant: 'destructive', }); } }; return (
( Team Name )} /> ( Team URL {!form.formState.errors.url && ( {field.value ? ( `${WEBAPP_BASE_URL}/t/${field.value}` ) : ( A unique URL to identify your team )} )} )} /> ( Default Document Visibility )} />
(
Send on Behalf of Team
{includeSenderDetailsCheck ? (
"{email}" on behalf of "{teamName}" has invited you to sign "example document".
) : (
"{teamUrl}" has invited you to sign "example document".
)}
)} />
{form.formState.isDirty && ( )}
); };