'use client'; import { getAuthMethodConfig, testEmailSend, updateAuthMethodConfig, } from '@/services/admin/authMethod'; 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/custom-components/editor'; import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input'; import { Icon } from '@workspace/ui/custom-components/icon'; import { useTranslations } from 'next-intl'; import { useEffect, useState } from 'react'; import { useForm } from 'react-hook-form'; 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 = useTranslations('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')); refetch(); setOpen(false); } catch (error) { toast.error(t('common.saveFailed')); } finally { setLoading(false); } } return (

{t('email.title')}

{t('email.description')}

{t('email.title')}
{t('email.basicSettings')} {t('email.smtpSettings')} {t('email.verifyTemplate')} {t('email.expirationTemplate')} {t('email.maintenanceTemplate')} {t('email.trafficTemplate')} ( {t('email.enable')} {t('email.enableDescription')} )} /> ( {t('email.emailVerification')} {t('email.emailVerificationDescription')} )} /> ( {t('email.emailSuffixWhitelist')} {t('email.emailSuffixWhitelistDescription')} )} /> ( {t('email.whitelistSuffixes')}