'use client'; import { getRegisterConfig, updateRegisterConfig } from '@/services/admin/system'; import { useSubscribe } from '@/store/subscribe'; 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 { Combobox } from '@workspace/ui/custom-components/combobox'; 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 registerSchema = z.object({ stop_register: z.boolean().optional(), enable_trial: z.boolean().optional(), trial_subscribe: z.number().optional(), trial_time: z.number().optional(), trial_time_unit: z.string().optional(), enable_ip_register_limit: z.boolean().optional(), ip_register_limit: z.number().optional(), ip_register_limit_duration: z.number().optional(), }); type RegisterFormData = z.infer; export default function RegisterConfig() { const t = useTranslations('system.register'); const systemT = useTranslations('system'); const [open, setOpen] = useState(false); const [loading, setLoading] = useState(false); const { data, refetch } = useQuery({ queryKey: ['getRegisterConfig'], queryFn: async () => { const { data } = await getRegisterConfig(); return data.data; }, enabled: open, }); const { subscribes } = useSubscribe(); const form = useForm({ resolver: zodResolver(registerSchema), defaultValues: { stop_register: false, enable_trial: false, trial_subscribe: undefined, trial_time: 0, trial_time_unit: 'day', enable_ip_register_limit: false, ip_register_limit: 1, ip_register_limit_duration: 1, }, }); useEffect(() => { if (data) { form.reset(data); } }, [data, form]); async function onSubmit(values: RegisterFormData) { setLoading(true); try { await updateRegisterConfig(values as API.RegisterConfig); toast.success(t('saveSuccess')); refetch(); setOpen(false); } catch (error) { toast.error(t('saveFailed')); } finally { setLoading(false); } } return (

{t('title')}

{t('description')}

{t('title')}
( {t('stopNewUserRegistration')} {t('stopNewUserRegistrationDescription')} )} /> ( {t('ipRegistrationLimit')} {t('ipRegistrationLimitDescription')} )} /> {form.watch('enable_ip_register_limit') && (
( {t('registrationLimitCount')} field.onChange(Number(value))} /> {t('registrationLimitCountDescription')} )} /> ( {t('registrationLimitExpire')} field.onChange(Number(value))} /> {t('registrationLimitExpireDescription')} )} />
)} ( {t('enableTrial')} {t('enableTrialDescription')} )} /> {form.watch('enable_trial') && ( <> ( {t('trialConfig')}
field.onChange(Number(value))} className='flex-1' prefix={ ( { if (value) { field.onChange(value); } }} options={subscribes?.map((item) => ({ label: item.name!, value: item.id!, }))} className='bg-secondary w-32 rounded-r-none' /> )} /> } suffix={ ( { unitField.onChange(value); }} options={[ { label: t('none'), value: 'None' }, { label: t('year'), value: 'Year' }, { label: t('month'), value: 'Month' }, { label: t('day'), value: 'Day' }, { label: t('hour'), value: 'Hour' }, { label: t('minute'), value: 'Minute' }, ]} className='bg-secondary w-32 rounded-l-none' /> )} /> } />
{t('trialConfigDescription')}
)} /> )}
); }