import { useEffect, useState } from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { useLingui } from '@lingui/react/macro'; import { Trans } from '@lingui/react/macro'; import type * as DialogPrimitive from '@radix-ui/react-dialog'; import { useForm } from 'react-hook-form'; import type { z } from 'zod'; import { useCurrentOrganisation } from '@documenso/lib/client-only/providers/organisation'; import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import { trpc } from '@documenso/trpc/react'; import { ZCreateOrganisationEmailDomainRequestSchema } from '@documenso/trpc/server/enterprise-router/create-organisation-email-domain.types'; import { Button } from '@documenso/ui/primitives/button'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from '@documenso/ui/primitives/dialog'; import { Form, FormControl, FormDescription, 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'; import { OrganisationEmailDomainRecordContent } from './organisation-email-domain-records-dialog'; export type OrganisationEmailCreateDialogProps = { trigger?: React.ReactNode; } & Omit; const ZCreateOrganisationEmailDomainFormSchema = ZCreateOrganisationEmailDomainRequestSchema.pick({ domain: true, }); type TCreateOrganisationEmailDomainFormSchema = z.infer< typeof ZCreateOrganisationEmailDomainFormSchema >; type DomainRecord = { name: string; value: string; type: string; }; export const OrganisationEmailDomainCreateDialog = ({ trigger, ...props }: OrganisationEmailCreateDialogProps) => { const { t } = useLingui(); const { toast } = useToast(); const organisation = useCurrentOrganisation(); const [open, setOpen] = useState(false); const [step, setStep] = useState<'domain' | 'verification'>('domain'); const [recordsToAdd, setRecordsToAdd] = useState([]); const form = useForm({ resolver: zodResolver(ZCreateOrganisationEmailDomainFormSchema), defaultValues: { domain: '', }, }); const { mutateAsync: createOrganisationEmail } = trpc.enterprise.organisation.emailDomain.create.useMutation(); // Reset state when dialog closes useEffect(() => { if (!open) { form.reset(); setStep('domain'); } }, [open, form]); const onFormSubmit = async ({ domain }: TCreateOrganisationEmailDomainFormSchema) => { try { const { records } = await createOrganisationEmail({ domain, organisationId: organisation.id, }); setRecordsToAdd(records); setStep('verification'); toast({ title: t`Domain Added`, description: t`DKIM records generated. Please add the DNS records to verify your domain.`, }); } catch (err) { const error = AppError.parseError(err); console.error(error); if (error.code === AppErrorCode.ALREADY_EXISTS) { toast({ title: t`Domain already in use`, description: t`Please try a different domain.`, variant: 'destructive', duration: 10000, }); } else { toast({ title: t`An unknown error occurred`, description: t`We encountered an unknown error while attempting to add your domain. Please try again later.`, variant: 'destructive', }); } } }; return ( !form.formState.isSubmitting && setOpen(value)} > e.stopPropagation()} asChild={true}> {trigger ?? ( )} {step === 'domain' ? ( Add Custom Email Domain Add a custom domain to send emails on behalf of your organisation. We'll generate DKIM records that you need to add to your DNS provider.
( Domain Name Enter the domain you want to use for sending emails (without http:// or www) )} />
) : ( )}
); };