"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { ArrowLeft, Plus, X, Loader2 } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; import { Card, CardContent } from "@/components/ui/card"; import { Separator } from "@/components/ui/separator"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { toast } from "sonner"; import { slugify } from "@/lib/utils"; import type { DiseaseInput } from "@/lib/validations"; interface DiseaseFormProps { initialData?: DiseaseInput & { id?: string; slug?: string }; mode: "create" | "edit"; } export default function DiseaseForm({ initialData, mode }: DiseaseFormProps) { const router = useRouter(); const [loading, setLoading] = useState(false); const [name, setName] = useState(initialData?.name ?? ""); const [nameEn, setNameEn] = useState(initialData?.nameEn ?? ""); const [scientificName, setScientificName] = useState(initialData?.scientificName ?? ""); const [type, setType] = useState(initialData?.type ?? "FUNGAL"); const [severity, setSeverity] = useState(initialData?.severity ?? "MEDIUM"); const [description, setDescription] = useState(initialData?.description ?? ""); const [descriptionEn, setDescriptionEn] = useState(initialData?.descriptionEn ?? ""); const [symptoms, setSymptoms] = useState(initialData?.symptoms ?? [""]); const [symptomsEn, setSymptomsEn] = useState(initialData?.symptomsEn ?? [""]); const [treatment, setTreatment] = useState(initialData?.treatment ?? ""); const [treatmentEn, setTreatmentEn] = useState(initialData?.treatmentEn ?? ""); const [season, setSeason] = useState(initialData?.season ?? ""); const [seasonEn, setSeasonEn] = useState(initialData?.seasonEn ?? ""); const [iconName, setIconName] = useState(initialData?.iconName ?? "leaf"); const [iconColor, setIconColor] = useState(initialData?.iconColor ?? "#1D9E75"); const [bgColor, setBgColor] = useState(initialData?.bgColor ?? "#E1F5EE"); const [published, setPublished] = useState(initialData?.published ?? true); function addSymptom(lang: "fr" | "en") { if (lang === "fr") setSymptoms([...symptoms, ""]); else setSymptomsEn([...symptomsEn, ""]); } function removeSymptom(lang: "fr" | "en", index: number) { if (lang === "fr") setSymptoms(symptoms.filter((_, i) => i !== index)); else setSymptomsEn(symptomsEn.filter((_, i) => i !== index)); } function updateSymptom(lang: "fr" | "en", index: number, value: string) { if (lang === "fr") { const next = [...symptoms]; next[index] = value; setSymptoms(next); } else { const next = [...symptomsEn]; next[index] = value; setSymptomsEn(next); } } async function handleSubmit(e: React.FormEvent) { e.preventDefault(); if (loading) return; if (!name.trim() || !description.trim() || !treatment.trim() || !season.trim()) { toast.error("Veuillez remplir tous les champs obligatoires"); return; } const filteredSymptoms = symptoms.filter((s) => s.trim()); if (filteredSymptoms.length === 0) { toast.error("Ajoutez au moins un symptome"); return; } setLoading(true); const body: DiseaseInput = { name: name.trim(), nameEn: nameEn.trim(), scientificName: scientificName.trim(), slug: slugify(name), type: type as DiseaseInput["type"], severity: severity as DiseaseInput["severity"], description: description.trim(), descriptionEn: descriptionEn.trim(), symptoms: filteredSymptoms, symptomsEn: symptomsEn.filter((s) => s.trim()), treatment: treatment.trim(), treatmentEn: treatmentEn.trim(), season: season.trim(), seasonEn: seasonEn.trim(), iconName, iconColor, bgColor, published, }; try { const url = mode === "create" ? "/api/diseases" : `/api/diseases/${initialData?.id}`; const method = mode === "create" ? "POST" : "PUT"; const res = await fetch(url, { method, headers: { "Content-Type": "application/json" }, body: JSON.stringify(body), }); if (!res.ok) { const data = await res.json(); toast.error(data.error || "Erreur"); return; } toast.success(mode === "create" ? "Maladie creee" : "Maladie mise a jour"); router.push("/diseases"); router.refresh(); } catch { toast.error("Une erreur est survenue"); } finally { setLoading(false); } } return (

{mode === "create" ? "Nouvelle maladie" : `Modifier — ${initialData?.name}`}

{/* General info */}

Informations generales

setName(e.target.value)} className="rounded-xl" required />
setNameEn(e.target.value)} className="rounded-xl" />
setScientificName(e.target.value)} className="rounded-xl" />
{/* Classification */}

Classification

{/* Description */}

Description