'use client' import { useForm, Controller } from 'react-hook-form' import { zodResolver } from '@hookform/resolvers/zod' import { z } from 'zod' import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Label } from '@/components/ui/label' import { LoadingSpinner } from '@/components/common/LoadingSpinner' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible' import { Alert, AlertTitle, AlertDescription } from '@/components/ui/alert' import { useSettings, useUpdateSettings } from '@/lib/hooks/use-settings' import { useEffect, useState } from 'react' import { ChevronDownIcon } from 'lucide-react' import { useTranslation } from '@/lib/hooks/use-translation' const settingsSchema = z.object({ default_content_processing_engine_doc: z.enum(['auto', 'docling', 'simple']).optional(), default_content_processing_engine_url: z.enum(['auto', 'firecrawl', 'jina', 'simple']).optional(), default_embedding_option: z.enum(['ask', 'always', 'never']).optional(), auto_delete_files: z.enum(['yes', 'no']).optional(), }) type SettingsFormData = z.infer export function SettingsForm() { const { t } = useTranslation() const { data: settings, isLoading, error } = useSettings() const updateSettings = useUpdateSettings() const [expandedSections, setExpandedSections] = useState>({ doc: false, url: false, embedding: false, files: false }) const [hasResetForm, setHasResetForm] = useState(false) const { control, handleSubmit, reset, formState: { isDirty } } = useForm({ resolver: zodResolver(settingsSchema), defaultValues: { default_content_processing_engine_doc: undefined, default_content_processing_engine_url: undefined, default_embedding_option: undefined, auto_delete_files: undefined, } }) const toggleSection = (section: string) => { setExpandedSections(prev => ({ ...prev, [section]: !prev[section] })) } useEffect(() => { if (settings && settings.default_content_processing_engine_doc && !hasResetForm) { const formData = { default_content_processing_engine_doc: settings.default_content_processing_engine_doc as 'auto' | 'docling' | 'simple', default_content_processing_engine_url: settings.default_content_processing_engine_url as 'auto' | 'firecrawl' | 'jina' | 'simple', default_embedding_option: settings.default_embedding_option as 'ask' | 'always' | 'never', auto_delete_files: settings.auto_delete_files as 'yes' | 'no', } reset(formData) setHasResetForm(true) } }, [hasResetForm, reset, settings]) const onSubmit = async (data: SettingsFormData) => { await updateSettings.mutateAsync(data) } if (isLoading) { return (
) } if (error) { return ( {t('settings.loadFailed')} {error instanceof Error ? error.message : t('common.error')} ) } return (
{t('settings.contentProcessing')} {t('settings.contentProcessingDesc')}
( )} /> toggleSection('doc')}> {t('settings.helpMeChoose')}

{t('settings.docHelp')}

( )} /> toggleSection('url')}> {t('settings.helpMeChoose')}

{t('settings.urlHelp')}

{t('settings.embeddingAndSearch')} {t('settings.embeddingAndSearchDesc')}
( )} /> toggleSection('embedding')}> {t('settings.helpMeChoose')}

{t('settings.embeddingHelp')}

{t('settings.fileManagement')} {t('settings.fileManagementDesc')}
( )} /> toggleSection('files')}> {t('settings.helpMeChoose')}

{t('settings.filesHelp')}

) }