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 { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import { trpc } from '@documenso/trpc/react'; import { ZCreateOrganisationEmailRequestSchema } from '@documenso/trpc/server/enterprise-router/create-organisation-email.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'; type EmailDomain = { id: string; domain: string; status: string; }; export type OrganisationEmailCreateDialogProps = { trigger?: React.ReactNode; emailDomain: EmailDomain; } & Omit; const ZCreateOrganisationEmailFormSchema = ZCreateOrganisationEmailRequestSchema.pick({ emailName: true, email: true, // replyTo: true, }); type TCreateOrganisationEmailFormSchema = z.infer; export const OrganisationEmailCreateDialog = ({ trigger, emailDomain, ...props }: OrganisationEmailCreateDialogProps) => { const { t } = useLingui(); const { toast } = useToast(); const [open, setOpen] = useState(false); const form = useForm({ resolver: zodResolver(ZCreateOrganisationEmailFormSchema), defaultValues: { emailName: '', email: '', // replyTo: '', }, }); const { mutateAsync: createOrganisationEmail, isPending } = trpc.enterprise.organisation.email.create.useMutation(); // Reset state when dialog closes useEffect(() => { if (!open) { form.reset(); } }, [open, form]); const onFormSubmit = async (data: TCreateOrganisationEmailFormSchema) => { try { await createOrganisationEmail({ emailDomainId: emailDomain.id, ...data, }); toast({ title: t`Email Created`, description: t`The organisation email has been created successfully.`, }); setOpen(false); } catch (err) { const error = AppError.parseError(err); console.error(error); if (error.code === AppErrorCode.ALREADY_EXISTS) { toast({ title: t`Email already exists`, description: t`An email with this address already exists.`, variant: 'destructive', }); } else { toast({ title: t`An error occurred`, description: t`We encountered an error while creating the email. Please try again later.`, variant: 'destructive', }); } } }; return ( !isPending && setOpen(value)}> e.stopPropagation()} asChild={true}> {trigger ?? ( )} Add Organisation Email Create a new email address for your organisation using the domain{' '} {emailDomain.domain}.
( Display Name The display name for this email address )} /> ( Email Address
{ field.onChange(e.target.value + '@' + emailDomain.domain); }} placeholder="support" />
@{emailDomain.domain}
{!form.formState.errors.email && ( {field.value ? ( field.value ) : ( The part before the @ symbol (e.g., "support" for support@ {emailDomain.domain}) )} )}
)} /> {/* ( Reply-To Email Optional no-reply email address attached to emails. Leave blank to default to the organisation settings reply-to email. )} /> */}
); };