import React, { FC, useMemo, useState } from "react"; import { useForm } from "react-hook-form"; // types import { IFormattedInstanceConfiguration, TInstanceEmailConfigurationKeys } from "@plane/types"; // ui import { Button, CustomSelect, TOAST_TYPE, setToast } from "@plane/ui"; // components import { ControllerInput, TControllerInputFormField } from "@/components/common"; // hooks import { useInstance } from "@/hooks/store"; // local components import { SendTestEmailModal } from "./test-email-modal"; type IInstanceEmailForm = { config: IFormattedInstanceConfiguration; }; type EmailFormValues = Record; type TEmailSecurityKeys = "EMAIL_USE_TLS" | "EMAIL_USE_SSL" | "NONE"; const EMAIL_SECURITY_OPTIONS: { [key in TEmailSecurityKeys]: string } = { EMAIL_USE_TLS: "TLS", EMAIL_USE_SSL: "SSL", NONE: "No email security", }; export const InstanceEmailForm: FC = (props) => { const { config } = props; // states const [isSendTestEmailModalOpen, setIsSendTestEmailModalOpen] = useState(false); // store hooks const { updateInstanceConfigurations } = useInstance(); // form data const { handleSubmit, watch, setValue, control, formState: { errors, isValid, isDirty, isSubmitting }, } = useForm({ defaultValues: { EMAIL_HOST: config["EMAIL_HOST"], EMAIL_PORT: config["EMAIL_PORT"], EMAIL_HOST_USER: config["EMAIL_HOST_USER"], EMAIL_HOST_PASSWORD: config["EMAIL_HOST_PASSWORD"], EMAIL_USE_TLS: config["EMAIL_USE_TLS"], EMAIL_USE_SSL: config["EMAIL_USE_SSL"], EMAIL_FROM: config["EMAIL_FROM"], }, }); const emailFormFields: TControllerInputFormField[] = [ { key: "EMAIL_HOST", type: "text", label: "Host", placeholder: "email.google.com", error: Boolean(errors.EMAIL_HOST), required: true, }, { key: "EMAIL_PORT", type: "text", label: "Port", placeholder: "8080", error: Boolean(errors.EMAIL_PORT), required: true, }, { key: "EMAIL_FROM", type: "text", label: "Sender email address", description: "This is the email address your users will see when getting emails from this instance. You will need to verify this address.", placeholder: "no-reply@projectplane.so", error: Boolean(errors.EMAIL_FROM), required: true, }, ]; const OptionalEmailFormFields: TControllerInputFormField[] = [ { key: "EMAIL_HOST_USER", type: "text", label: "Username", placeholder: "getitdone@projectplane.so", error: Boolean(errors.EMAIL_HOST_USER), required: false, }, { key: "EMAIL_HOST_PASSWORD", type: "password", label: "Password", placeholder: "Password", error: Boolean(errors.EMAIL_HOST_PASSWORD), required: false, }, ]; const onSubmit = async (formData: EmailFormValues) => { const payload: Partial = { ...formData }; await updateInstanceConfigurations(payload) .then(() => setToast({ type: TOAST_TYPE.SUCCESS, title: "Success", message: "Email Settings updated successfully", }) ) .catch((err) => console.error(err)); }; const useTLSValue = watch("EMAIL_USE_TLS"); const useSSLValue = watch("EMAIL_USE_SSL"); const emailSecurityKey: TEmailSecurityKeys = useMemo(() => { if (useTLSValue === "1") return "EMAIL_USE_TLS"; if (useSSLValue === "1") return "EMAIL_USE_SSL"; return "NONE"; }, [useTLSValue, useSSLValue]); const handleEmailSecurityChange = (key: TEmailSecurityKeys) => { if (key === "EMAIL_USE_SSL") { setValue("EMAIL_USE_TLS", "0"); setValue("EMAIL_USE_SSL", "1"); } if (key === "EMAIL_USE_TLS") { setValue("EMAIL_USE_TLS", "1"); setValue("EMAIL_USE_SSL", "0"); } if (key === "NONE") { setValue("EMAIL_USE_TLS", "0"); setValue("EMAIL_USE_SSL", "0"); } }; return (
setIsSendTestEmailModalOpen(false)} />
{emailFormFields.map((field) => ( ))}

Email security

{Object.entries(EMAIL_SECURITY_OPTIONS).map(([key, value]) => ( {value} ))}
Authentication (optional)
We recommend setting up a username password for your SMTP server
{OptionalEmailFormFields.map((field) => ( ))}
); };