import { zodResolver } from "@hookform/resolvers/zod"; import { useQuery } from "@tanstack/react-query"; import { Button } from "@workspace/ui/components/button"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@workspace/ui/components/form"; import { ScrollArea } from "@workspace/ui/components/scroll-area"; import { Sheet, SheetContent, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, } from "@workspace/ui/components/sheet"; import { Switch } from "@workspace/ui/components/switch"; import { Tabs, TabsContent, TabsList, TabsTrigger, } from "@workspace/ui/components/tabs"; import { Textarea } from "@workspace/ui/components/textarea"; import { HTMLEditor } from "@workspace/ui/composed/editor/html"; import { EnhancedInput } from "@workspace/ui/composed/enhanced-input"; import { Icon } from "@workspace/ui/composed/icon"; import { getAuthMethodConfig, testEmailSend, updateAuthMethodConfig, } from "@workspace/ui/services/admin/authMethod"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; import { z } from "zod"; const emailSettingsSchema = z.object({ id: z.number(), method: z.string(), enabled: z.boolean(), config: z .object({ enable_verify: z.boolean(), enable_domain_suffix: z.boolean(), domain_suffix_list: z.string().optional(), verify_email_template: z.string().optional(), expiration_email_template: z.string().optional(), maintenance_email_template: z.string().optional(), traffic_exceed_email_template: z.string().optional(), platform: z.string(), platform_config: z .object({ host: z.string().optional(), port: z.number().optional(), ssl: z.boolean(), user: z.string().optional(), pass: z.string().optional(), from: z.string().optional(), }) .optional(), }) .optional(), }); type EmailSettingsFormData = z.infer; export default function EmailSettingsForm() { const { t } = useTranslation("auth-control"); const [open, setOpen] = useState(false); const [loading, setLoading] = useState(false); const [testEmail, setTestEmail] = useState(); const { data, refetch, isFetching } = useQuery({ queryKey: ["getAuthMethodConfig", "email"], queryFn: async () => { const { data } = await getAuthMethodConfig({ method: "email", }); return data.data; }, enabled: open, }); const form = useForm({ resolver: zodResolver(emailSettingsSchema), defaultValues: { id: 0, method: "email", enabled: false, config: { enable_verify: false, enable_domain_suffix: false, domain_suffix_list: "", verify_email_template: "", expiration_email_template: "", maintenance_email_template: "", traffic_exceed_email_template: "", platform: "smtp", platform_config: { host: "", port: 587, ssl: false, user: "", pass: "", from: "", }, }, }, }); useEffect(() => { if (data) { form.reset(data); } }, [data, form]); async function onSubmit(values: EmailSettingsFormData) { setLoading(true); try { await updateAuthMethodConfig({ ...values, config: { ...values.config, platform: "smtp", }, } as API.UpdateAuthMethodConfigRequest); toast.success(t("common.saveSuccess", "Saved successfully")); refetch(); setOpen(false); } catch (_error) { toast.error(t("common.saveFailed", "Save failed")); } finally { setLoading(false); } } return (

{t("email.title", "Email Settings")}

{t( "email.description", "Configure email authentication and templates" )}

{t("email.title", "Email Settings")}
{t("email.basicSettings", "Basic Settings")} {t("email.smtpSettings", "SMTP Settings")} {t("email.verifyTemplate", "Verify Template")} {t("email.expirationTemplate", "Expiration Template")} {t("email.maintenanceTemplate", "Maintenance Template")} {t("email.trafficTemplate", "Traffic Template")} ( {t("email.enable", "Enable")} {t( "email.enableDescription", "When enabled, users can sign in with email" )} )} /> ( {t("email.emailVerification", "Email Verification")} {t( "email.emailVerificationDescription", "Require email verification for new users" )} )} /> ( {t( "email.emailSuffixWhitelist", "Email Suffix Whitelist" )} {t( "email.emailSuffixWhitelistDescription", "Only allow emails from whitelisted domains" )} )} /> ( {t("email.whitelistSuffixes", "Whitelist Suffixes")}