'use client'; import { getAuthMethodConfig, 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 { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input'; import { Icon } from '@workspace/ui/custom-components/icon'; import { useTranslations } from 'next-intl'; import { uid } from 'radash'; import { useEffect, useState } from 'react'; import { useForm } from 'react-hook-form'; import { toast } from 'sonner'; import { z } from 'zod'; const deviceSchema = z.object({ id: z.number(), method: z.string().default('device'), enabled: z.boolean().default(false), config: z .object({ show_ads: z.boolean().optional(), only_real_device: z.boolean().optional(), enable_security: z.boolean().optional(), security_secret: z.string().optional(), }) .optional(), }); type DeviceFormData = z.infer; export default function DeviceForm() { const t = useTranslations('auth-control'); const [open, setOpen] = useState(false); const [loading, setLoading] = useState(false); const { data, refetch } = useQuery({ queryKey: ['getAuthMethodConfig', 'device'], queryFn: async () => { const { data } = await getAuthMethodConfig({ method: 'device', }); return data.data; }, enabled: open, }); const form = useForm({ resolver: zodResolver(deviceSchema), defaultValues: { id: 0, method: 'device', enabled: false, config: { show_ads: false, only_real_device: false, enable_security: false, security_secret: '', }, }, }); useEffect(() => { if (data) { form.reset(data); } }, [data, form]); async function onSubmit(values: DeviceFormData) { setLoading(true); try { await updateAuthMethodConfig(values as API.UpdateAuthMethodConfigRequest); toast.success(t('common.saveSuccess')); refetch(); setOpen(false); } catch (error) { toast.error(t('common.saveFailed')); } finally { setLoading(false); } } function generateSecurityKey() { const id = uid(32).toLowerCase(); const formatted = `${id.slice(0, 8)}-${id.slice(8, 12)}-${id.slice(12, 16)}-${id.slice(16, 20)}-${id.slice(20)}`; form.setValue('config.security_secret', formatted); } return (

{t('device.title')}

{t('device.description')}

{t('device.title')}
( {t('device.enable')} {t('device.enableDescription')} )} /> ( {t('device.showAds')} {t('device.showAdsDescription')} )} /> ( {t('device.blockVirtualMachine')} {t('device.blockVirtualMachineDescription')} )} /> ( {t('device.enableSecurity')} {t('device.enableSecurityDescription')} )} /> ( {t('device.communicationKey')} } /> {t('device.communicationKeyDescription')} )} />
); }