/** * Vacation responder — toggle + date range + auto-reply text. * Form validation: React Hook Form + Zod. */ import React, { useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { Button } from '@/components/ui/Button'; import { Input } from '@/components/ui/Input'; import { Card } from '@/components/ui/Card'; import { useToast } from '@/components/ui/Toast'; import { configureVacation, type VacationPayload } from '@/api/mail'; // ── Zod Schema ── const vacationSchema = z.object({ enabled: z.boolean().default(false), start_date: z.string().optional().default(''), end_date: z.string().optional().default(''), subject: z.string().optional().default(''), body: z.string().optional().default(''), }).superRefine((data, ctx) => { if (data.enabled && data.start_date && data.end_date) { const start = new Date(data.start_date); const end = new Date(data.end_date); if (!Number.isNaN(start.getTime()) && !Number.isNaN(end.getTime())) { if (end < start) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'endBeforeStart', path: ['end_date'], }); } } } }); type VacationFormData = z.infer; export function VacationResponder({ accountId }: { accountId: string }) { const { t } = useTranslation(); const toast = useToast(); const { register, handleSubmit, watch, formState: { errors, isSubmitting }, } = useForm({ resolver: zodResolver(vacationSchema), defaultValues: { enabled: false, start_date: '', end_date: '', subject: '', body: '' }, }); const enabled = watch('enabled'); const onSubmit = useCallback(async (data: VacationFormData) => { try { const payload: VacationPayload = { enabled: data.enabled, start_date: data.start_date || null, end_date: data.end_date || null, subject: data.subject, body: data.body, }; await configureVacation(payload); toast.success(t('mail.vacationSaved')); } catch (err) { toast.error(err instanceof Error ? err.message : String(err)); } }, [toast, t]); const errorMsg = (key: string | undefined) => { if (!key) return undefined; if (key === 'endBeforeStart') return t('calendar.endBeforeStart', 'End must be after start'); return key; }; return (
{enabled && (