import { useEffect, useState } from 'react'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { toast } from 'sonner'; import { useTranslation } from 'react-i18next'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { PasswordField } from '@/components/ui/PasswordField'; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { FormErrorBanner } from '@/components/ui/FormErrorBanner'; import { FieldError } from '@/components/ui/FieldError'; import { useAddCmsInstance } from '@/api/useAddCmsInstance'; import { NetworkError, ProblemDetailsError } from '@/lib/api-client'; import { addCmsInstanceSchema, type AddCmsInstanceFormData } from '@/lib/schemas/cms'; interface AddCmsInstanceDialogProps { open: boolean; onOpenChange: (open: boolean) => void; } export function AddCmsInstanceDialog({ open, onOpenChange }: AddCmsInstanceDialogProps) { const { t } = useTranslation(); const [serverError, setServerError] = useState(null); const addInstance = useAddCmsInstance({ onError: (err) => { if (err instanceof ProblemDetailsError && err.status === 409) { setServerError(t('cms.add.errors.conflict')); } else if (err instanceof NetworkError) { setServerError(t('errors.network')); } else { setServerError(t('errors.generic')); } }, }); const { register, handleSubmit, reset, formState: { errors, isSubmitting }, } = useForm({ resolver: zodResolver(addCmsInstanceSchema), mode: 'onTouched', }); useEffect(() => { if (!open) { setServerError(null); addInstance.reset(); reset(); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [open]); const onSubmit = handleSubmit(async (values) => { setServerError(null); try { await addInstance.mutateAsync(values); toast.success(t('cms.add.successToast')); onOpenChange(false); } catch { // error shown via serverError state } }); return ( {t('cms.add.title')}
setServerError(null)} />
{errors.name && ( )}
{errors.url && ( )}
{errors.apiKey && ( )}
); }