'use client'; import { getSiteConfig, updateSiteConfig } from '@/services/admin/system'; 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 { Textarea } from '@workspace/ui/components/textarea'; import { JSONEditor } from '@workspace/ui/custom-components/editor'; import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input'; import { Icon } from '@workspace/ui/custom-components/icon'; import { UploadImage } from '@workspace/ui/custom-components/upload-image'; 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 siteSchema = z.object({ site_logo: z.string().optional(), site_name: z.string().min(1), site_desc: z.string().optional(), keywords: z.string().optional(), custom_html: z.string().optional(), host: z.string().optional(), custom_data: z.any().optional(), }); type SiteFormData = z.infer; export default function SiteConfig() { const t = useTranslations('system'); const [open, setOpen] = useState(false); const [loading, setLoading] = useState(false); const { data, refetch } = useQuery({ queryKey: ['getSiteConfig'], queryFn: async () => { const { data } = await getSiteConfig(); return data.data; }, enabled: open, }); const form = useForm({ resolver: zodResolver(siteSchema), defaultValues: { site_logo: '', site_name: '', site_desc: '', keywords: '', custom_html: '', host: '', custom_data: {}, }, }); useEffect(() => { if (data) { form.reset(data); } }, [data, form]); async function onSubmit(values: SiteFormData) { setLoading(true); try { await updateSiteConfig(values as API.SiteConfig); toast.success(t('common.saveSuccess')); refetch(); setOpen(false); } catch (error) { toast.error(t('common.saveFailed')); } finally { setLoading(false); } } return (

{t('site.title')}

{t('site.description')}

{t('site.title')}
( {t('site.logo')} { field.onChange(value); }} /> } /> {t('site.logoDescription')} )} /> ( {t('site.siteName')} {t('site.siteNameDescription')} )} /> ( {t('site.siteDesc')} {t('site.siteDescDescription')} )} /> ( {t('site.keywords')} {t('site.keywordsDescription')} )} /> ( {t('site.customHtml')}