import { useEffect } from 'react' import * as z from 'zod' import { useForm } from 'react-hook-form' import { zodResolver } from '@hookform/resolvers/zod' import { useTranslation } from 'react-i18next' import { Button } from '@/components/ui/button' import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form' import { Input } from '@/components/ui/input' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' import { Switch } from '@/components/ui/switch' import { SettingsSection } from '../components/settings-section' import { useUpdateOption } from '../hooks/use-update-option' const dataDashboardSchema = z.object({ DataExportEnabled: z.boolean(), DataExportInterval: z.number().int().min(1).max(1440), DataExportDefaultTime: z.enum(['hour', 'day', 'week']), }) type DataDashboardFormValues = z.infer type DashboardSectionProps = { defaultValues: DataDashboardFormValues } const granularityOptions = [ { label: 'Hour', value: 'hour' }, { label: 'Day', value: 'day' }, { label: 'Week', value: 'week' }, ] export function DashboardSection({ defaultValues }: DashboardSectionProps) { const { t } = useTranslation() const updateOption = useUpdateOption() const form = useForm({ resolver: zodResolver(dataDashboardSchema), defaultValues, }) useEffect(() => { form.reset(defaultValues) }, [defaultValues, form]) const onSubmit = async (values: DataDashboardFormValues) => { const updates = Object.entries(values).filter( ([key, value]) => value !== defaultValues[key as keyof DataDashboardFormValues] ) for (const [key, value] of updates) { await updateOption.mutateAsync({ key, value }) } } const isEnabled = form.watch('DataExportEnabled') return (
(
{t('Enable Data Dashboard')}
)} />
( {t('Refresh interval (minutes)')} field.onChange(e.target.valueAsNumber)} /> {t('Keep this above 1 minute to avoid heavy database load')} )} /> ( {t('Default time granularity')} {t( 'UI granularity only — data is still aggregated hourly' )} )} />
) }