import { zodResolver } from '@hookform/resolvers/zod'; import { msg } from '@lingui/core/macro'; import { useLingui } from '@lingui/react'; import { Trans } from '@lingui/react/macro'; import { AnimatePresence, motion } from 'framer-motion'; import { useForm } from 'react-hook-form'; import { useNavigate } from 'react-router'; import type { z } from 'zod'; import { useCurrentOrganisation } from '@documenso/lib/client-only/providers/organisation'; import { useSession } from '@documenso/lib/client-only/providers/session'; import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import { trpc } from '@documenso/trpc/react'; import { ZUpdateOrganisationRequestSchema } from '@documenso/trpc/server/organisation-router/update-organisation.types'; import { Button } from '@documenso/ui/primitives/button'; 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'; const ZOrganisationUpdateFormSchema = ZUpdateOrganisationRequestSchema.shape.data.pick({ name: true, url: true, }); type TOrganisationUpdateFormSchema = z.infer; export const OrganisationUpdateForm = () => { const navigate = useNavigate(); const organisation = useCurrentOrganisation(); const { refreshSession } = useSession(); const { _ } = useLingui(); const { toast } = useToast(); const form = useForm({ resolver: zodResolver(ZOrganisationUpdateFormSchema), defaultValues: { name: organisation.name, url: organisation.url, }, }); const { mutateAsync: updateOrganisation } = trpc.organisation.update.useMutation(); const onFormSubmit = async ({ name, url }: TOrganisationUpdateFormSchema) => { try { await updateOrganisation({ data: { name, url, }, organisationId: organisation.id, }); await refreshSession(); if (url !== organisation.url) { await navigate(`/o/${url}/settings`); } toast({ title: _(msg`Success`), description: _(msg`Your organisation has been successfully updated.`), duration: 5000, }); form.reset({ name, url, }); } 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 organisation. Please try again later.`, ), variant: 'destructive', }); } }; return (
( Organisation Name )} /> ( Organisation URL {!form.formState.errors.url && ( {field.value ? ( `${NEXT_PUBLIC_WEBAPP_URL()}/o/${field.value}` ) : ( A unique URL to identify your organisation )} )} )} />
{form.formState.isDirty && ( )}
); };