'use client'; import { getApplication, getApplicationConfig, updateApplicationConfig, } from '@/services/admin/system'; import { zodResolver } from '@hookform/resolvers/zod'; import { Icon } from '@iconify/react'; 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 { Textarea } from '@workspace/ui/components/textarea'; import { Combobox } from '@workspace/ui/custom-components/combobox'; import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input'; import { UploadImage } from '@workspace/ui/custom-components/upload-image'; import { DicesIcon } from 'lucide-react'; 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 formSchema = z.object({ app_id: z.number().optional(), encryption_key: z.string().optional(), encryption_method: z.string().optional(), startup_picture: z.string().optional(), startup_picture_skip_time: z.number().optional(), domains: z.array(z.string()).optional(), }); type FormSchema = z.infer; export default function ConfigForm() { const t = useTranslations('product.app'); const [open, setOpen] = useState(false); const [loading, setLoading] = useState(false); const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { app_id: 0, encryption_key: '', encryption_method: '', startup_picture: '', startup_picture_skip_time: 0, domains: [], }, }); const { data, refetch } = useQuery({ queryKey: ['getApplicationConfig'], queryFn: async () => { const { data } = await getApplicationConfig(); return data.data; }, }); const { data: applications } = useQuery({ queryKey: ['getApplication'], queryFn: async () => { const { data } = await getApplication(); return data.data?.applications || []; }, }); useEffect(() => { if (data) { form.reset(data); } }, [data, form]); async function onSubmit(values: FormSchema) { setLoading(true); try { await updateApplicationConfig({ ...values, domains: values.domains?.filter((domain) => domain), } as API.ApplicationConfig); toast.success(t('updateSuccess')); refetch(); setOpen(false); } catch (error) { /* empty */ } finally { setLoading(false); } } return ( {t('configApp')}
( {t('selectApp')} {t('selectAppDescription')} ({ label: app.name, value: app.id, })) || [] } value={field.value} onChange={(value) => form.setValue(field.name, value)} /> )} /> ( {t('communicationKey')} {t('communicationKeyDescription')} form.setValue(field.name, value as string)} suffix={
{ 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(field.name, formatted); }} className='cursor-pointer' />
} />
)} /> ( {t('encryption')} {t('encryptionDescription')} form.setValue(field.name, value)} /> )} /> ( {t('startupPicture')} {t('startupPictureDescription')} form.setValue(field.name, value as string)} suffix={ form.setValue('startup_picture', value as string)} /> } /> )} /> ( {t('startupPictureSkip')} {t('startupPictureSkipDescription')} form.setValue('startup_picture_skip_time', Number(value)) } /> )} /> ( {t('backupDomains')} {t('backupDomainsDescription')}