diff --git a/frontend/src/components/PetForm.jsx b/frontend/src/components/PetForm.jsx index 22f92e7..5040ec9 100644 --- a/frontend/src/components/PetForm.jsx +++ b/frontend/src/components/PetForm.jsx @@ -10,9 +10,22 @@ const PetForm = ({ onCancel, onSave }) => { weight: '' }); const [isSubmitting, setIsSubmitting] = useState(false); + const [fieldErrors, setFieldErrors] = useState({}); + + const now = new Date(); + const today = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`; + const handleSubmit = async (e) => { e.preventDefault(); + setFieldErrors({}); + + // Klient-validering: framtida datum + if (formData.dob && formData.dob > today) { + setFieldErrors({ dob: 'Födelsedatum kan inte vara i framtiden.' }); + return; + } + setIsSubmitting(true); try { @@ -32,7 +45,40 @@ const PetForm = ({ onCancel, onSave }) => { onSave(); } catch (error) { console.error("Kunde inte spara djuret:", error); - alert("Något gick fel vid sparning. Kontrollera att alla obligatoriska fält är ifyllda."); + if (error.response?.status === 400) { + const data = error.response.data; + const errors = {}; + if (data?.errors) { + const fieldMap = { + dateOfBirth: 'dob', + weightKg: 'weight' + }; + + const addFieldError = (field, message) => { + const formField = fieldMap[field] || field; + errors[formField] = field === 'dateOfBirth' + ? 'Födelsedatum kan inte vara i framtiden.' + : message; + }; + + if (Array.isArray(data.errors)) { + data.errors.forEach(err => { + addFieldError(err.field, err.defaultMessage); + }); + } else { + Object.entries(data.errors).forEach(([field, messages]) => { + addFieldError(field, Array.isArray(messages) ? messages[0] : messages); + }); + } + } else if (data?.dateOfBirth || data?.message?.toLowerCase().includes('date')) { + errors.dob = 'Födelsedatum kan inte vara i framtiden.'; + } else { + errors.general = 'Något gick fel vid sparning. Kontrollera att alla obligatoriska fält är ifyllda.'; + } + setFieldErrors(errors); + } else { + setFieldErrors({ general: 'Något gick fel vid sparning. Försök igen.' }); + } } finally { setIsSubmitting(false); } @@ -111,10 +157,17 @@ const PetForm = ({ onCancel, onSave }) => { setFormData({...formData, dob: e.target.value})} - className="w-full px-4 py-3 rounded-lg border border-slate-200 bg-slate-50 focus:ring-2 focus:ring-blue-500 focus:bg-white outline-none transition font-medium italic" + max={today} + onChange={(e) => { + setFormData({...formData, dob: e.target.value}); + if (fieldErrors.dob) setFieldErrors({...fieldErrors, dob: undefined}); + }} + className={`w-full px-4 py-3 rounded-lg border bg-slate-50 focus:ring-2 focus:ring-blue-500 focus:bg-white outline-none transition font-medium italic ${fieldErrors.dob ? 'border-red-400 focus:ring-red-400' : 'border-slate-200'}`} required /> + {fieldErrors.dob && ( +

{fieldErrors.dob}

+ )} {/* VIKT */} @@ -132,6 +185,12 @@ const PetForm = ({ onCancel, onSave }) => { + {/* GENERELLT FEL */} + {fieldErrors.general && ( +
+ {fieldErrors.general} +
+ )} {/* KNAPPAR */}